我想我会问,因为我不确定这个操作的结果是不是原始性质的交易.
当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程序员可能会有同样的问题.