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

Php 如果发生错误,更新行并回滚SQL数据库的最佳方法是什么?,php,mysql,pdo,transactions,innodb,Php,Mysql,Pdo,Transactions,Innodb,我有一个脚本在我的InnoDB上执行多个更新,但是如果一个更新失败,我希望所有其他更新都回滚。所以我在网上搜索,我能找到的最好的是PDO::beginTransaction。除了我希望我的数据库在每次更新时都能被更新,如果其中一次更新失败,我需要删除以前的每一次更新。我需要这个,因为这个脚本可以从多个用户运行,并且之前更新的行不应该再次更新 例如: 这是我的“reserver”表: 第一行表示房间1与订单1匹配,因此无法再次匹配。因此,如果没有发生错误,这一行将保持不变,但如果用户取消或超时事件

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

例如:

这是我的“reserver”表:

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

现在我看到了两种方式:pdo事务(但我不知道如何实现)和我的实际方式:存储我的“reserver”表的每个id,并在发生错误时将它们全部删除

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




英语不是我的母语,所以请友好一些。

很抱歉在这里写这篇文章,因为我没有什么好评论的名声

1) 您应该使用所有更新查询都应该在其中的过程 2) 在调用BeginTransaction方法后调用该过程 在上面的场景中,如果任何查询无法更新行,那么整个过程都将回滚 3) 您还可以在过程中直接使用mysql事务 有关在过程级别使用的mysql事务,请参阅下面的链接
您可以使用事务管理来实现这一点。 检查以下代码:

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

这正是事务的用途。是时候学习了。它们并不难。但事务是否真的更新了我的数据库,或者在调用“提交”时它是否完成了(正如我在所有地方读到的那样)?在调用提交时它就完成了。这是事务如何工作的一个重要部分。我可能表达得不好,但您是否理解我希望在脚本结束之前实际更新我的行?我的意思是,多个最终用户可以使用我的脚本,所以我需要更新我的数据库,这样一个“房间”就不能被选中两次,但是如果我的脚本中以后出现了一些问题,那么这一行必须被删除。我认为pdo事务会在脚本结束时进行每次更新,但在此期间,另一个用户可能会选择“房间”,我会有两个用户拥有相同的“房间”。我不知道如何解释这个事务,但事务会完全按照您的需要进行。但是我不建议在过程级进行事务处理,因为如果你有一堆过程,那么在每个过程中你都必须实现相同的过程,所以在抽象级使用pdo begin transaction函数的最佳方法是实现begin事务,回滚和提交函数,并始终调用其中的过程。
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();
}