【问题标题】:What is the best way to update row and rollback my SQL database if and error occurs?如果发生错误,更新行和回滚我的 SQL 数据库的最佳方法是什么?
【发布时间】:2015-06-22 22:17:32
【问题描述】:

我有一个脚本在我的 InnoDB 上执行多个 UPDATE,但是如果一个 UPDATE 失败,我希望所有其他 UPDATE 都回滚。所以我在网上搜索,我能找到的最好的是 PDO::beginTransaction。除了我希望我的数据库为每个 UPDATE 实际更新,如果其中一个失败,我需要删除每个以前的 UPDATE。我需要这个,因为这个脚本可以从多个用户运行,并且之前更新的行不应该再次更新。

示例:

这是我的表“reserver”:

id | idChambre | idReservation
---+-----------+--------------
0  | 1         | 1

第一行表示房间1与订单1匹配,因此无法再次匹配。因此,如果没有发生任何错误,该行将保持不变,但如果发生用户取消或超时事件,我希望删除该行。

所以现在我看到了两种方式:pdo Transaction(但我不知道如何)和我的实际方式:存储我的“reserver”表的每个 id 并在出现问题时将它们全部删除。

有没有更好的方法?我做错了吗?



英语不是我的母语,所以请客气。

【问题讨论】:

  • 这正是交易的用途。是时候学习它们了。它们并不难。
  • 但是当调用“commit”时,事务是否真的更新了我的数据库或者它是否完成了(正如我在任何地方看到的那样)?
  • 调用commit的时候就完成了。这是交易运作方式的重要组成部分。
  • 我可能表达得很糟糕,但您是否理解我希望在脚本结束之前实际更新我的行?我的意思是多个最终用户可以使用我的脚本,所以我需要更新我的数据库,所以不能选择两次“房间”,但是如果稍后在我的脚本中出现问题,则必须删除该行。我认为 pdo 事务会在脚本末尾进行每个更新,但与此同时,另一个用户可能已经选择了“房间”,而我将有 2 个用户拥有相同的“房间”。
  • 我不知道如何解释这一点,但事务正是你需要的。阅读它们,你会看到的。

标签: php mysql pdo transactions innodb


【解决方案1】:

很抱歉在这里写它,因为我没有太多的声誉可以评论..

1) 您应该使用所有更新查询都应该在其中的过程 2) 调用begin transaction方法后调用程序 在上述情况下,如果任何查询未能更新行,那么您的整个过程将被回滚 3)您也可以直接在程序中使用mysql事务 请参阅下面的链接以获取在过程级别使用的 mysql 事务 How can I use transactions in my MySQL stored procedure?

【讨论】:

  • 但我不推荐在过程级别的事务,因为如果你有一堆过程,所以在每个过程中你必须实现相同的,所以在抽象中使用 pdo begin 事务函数的最佳方法级别将实现开始事务、回滚和提交功能,并始终在其中调用过程。
【解决方案2】:

您可以使用事务管理来实现此目的。 检查以下代码:

try {  
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $conn->beginTransaction();
  $conn->exec("first update query");
  $conn->exec("second update query");
  $conn->commit();

} catch (Exception $e) {
  $conn->rollBack();
  echo "Failed: " . $e->getMessage();
}

beginTransaction 之后执行的所有更新查询如果发生错误都会回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多