我想我应该问一下,因为我不确定这个操作的结果,因为它没有在原始性质上处理太多事务。
当php中抛出异常停止执行时,如何处理db事务。它是否会自动回滚,因为与数据库的连接是从php断开的,还是会保留一个锁?
伪码

TX Begin
Select Balance
Logic in PHP
  Exception
  Rollback
Commit

注意:我知道最佳编码实践要求我在捕获时回滚。这只是一个行为问题,我想知道。

最佳答案

要确定mysql在连接(会话)终止时如何处理事务,我们必须考虑是否启用autocommit模式。
如果autocommit被禁用,并且连接在提交之前被终止,则最后一次打开的时间transaction is rolled back
如果禁用autocommit的会话在未显式提交最终事务的情况下结束,mysql将回滚该事务。
注意,start transaction在事务期间隐式地disable autocommit
使用start transaction,autocommit将保持禁用状态,直到使用commit或rollback结束事务。然后,自动提交模式将恢复到以前的状态。
如果启用了自动提交,则仍会提交任何成功的数据修改。如果数据修改语句导致错误,那么显然不会提交更改(在本例中没有更改)。因此,终止连接在这种情况下没有任何区别。
不过,正如@markbaker也指出的那样,如果检测到错误以向代码的所有读者表明这一点,那么显式回滚事务仍然是一个好主意。请记住,您自己并不清楚这究竟是如何工作的,如果其他php程序员在您的代码中没有看到显式回滚,他们可能会有同样的问题。

关于php - 交易和异常(exception),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42906687/

10-11 03:34