php – 交易和例外

我想我会问,因为我不确定这个操作的结果是不是原始性质的交易.

PHP中抛出异常停止执行时,如何处理数据库事务.是否会自动回滚,因为从PHP中删除了与数据库的连接,或者锁定是否仍然存在?

伪代码

TX Begin
Select Balance
Logic in PHP
  Exception 
  Rollback
Commit

注意:我知道最好的编码实践要求我在catch中回滚.这只是我想知道的一个行为问题.

最佳答案 要确定MySQL在连接(会话)终止时如何处理事务,我们必须考虑是否启用自动提交模式.

>如果禁用自动提交并且在提交之前终止连接,则最后一次打开transaction is rolled back

If a session that has autocommit disabled ends without explicitly committing the final transaction, MySQL rolls back that transaction.

注意,启动事务在事务持续时间内隐式执行disable autocommit

With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.

>如果启用了自动提交,则无论如何都会提交任何成功的数据修改.如果数据修改语句导致错误,那么显然不会提交更改(嗯,在这种情况下没有变化).因此,在这种情况下,终止连接不会有任何区别.

但是,正如@MarkBaker所指出的那样,如果检测到错误以使代码的所有读者都明白这一点,那么显式回滚事务仍然是个好主意.请记住,你自己并不清楚这是如何工作的,如果他们没有在你的代码中看到明确的回滚,那么其他php程序员可能会有同样的问题.

点赞