如果发生错误,更新行和回滚SQL数据库的最佳方法是什么?

时间:2015-04-16 13:16:25

标签: php mysql pdo transactions innodb

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

例如:

这是我的表“reserver”:

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

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

所以现在我看到了两种方式:pdo Transaction(但我不知道怎么做)和我的实际方法:存储我的“reserver”表的每个id并在发生错误时将它们全部删除。

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



英语不是我的母语所以请你好。

2 个答案:

答案 0 :(得分:0)

抱歉在这里写这篇文章因为我没有多少声誉可以评论..

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

答案 1 :(得分:0)

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

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之后执行的所有更新查询。