PHP中的数据库事务回滚处理

use*_*729 2 php database transactions

try
{
  $con->beginTransaction();

  $this->doSave($con);

  $con->commit();
}
catch (Exception $e)
{
  $con->rollBack();

  throw $e;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是一种非常标准的处理事务的方法,

但我的问题是:如果$con->rollBack()也失败了怎么办?

它可能会导致数据库锁定,对吗?如果是这样,那么完美的方法是什么?

Pas*_*TIN 5

使用事务时,基本思想是在commit调用之前实际上不会将任何内容永久写入数据库。

几种情况:

  • 如果你 :
    • 开始交易
    • 执行一些查询
    • 回滚
    • 然后回滚查询;这意味着他们的结果不会写入数据库。
  • 如果你 :
    • 开始交易
    • 执行一些查询
    • 断开连接(如果您的 PHP 脚本结束,则会发生这种情况——例如,由于致命错误或die
    • 然后,查询不会被提交——这意味着它们不会被写入数据库;这意味着它就像有一个rollback.


为了让事情变得简单:从 开始begin transaction,没有任何东西被永久写入数据库,直到您发送commit. 如果没有提交......没有什么是永久写入的,并且当您的 PHP 脚本与数据库断开连接时,数据库会“取消”该 PHP 脚本未提交的内容。

当然,如果您使用 PHP 以外的其他东西连接到您的数据库,这也是完全相同的——例如命令行 MySQL 客户端。