我想我会问,因为我不确定这个操作的结果没有处理原始性质的事务。
当 PHP 抛出异常停止执行时,DB 事务是如何处理的。它会自动回滚,因为与数据库的连接已从 PHP 中删除,还是会保持锁定状态?
伪代码
TX Begin
Select Balance
Logic in PHP
Exception
Rollback
Commit
注意:我知道最佳编码实践要求我回滚捕获。这只是我想知道的一个行为问题。
最佳答案
要确定当连接( session )终止时 MySQL 如何处理事务,我们必须考虑是否启用了 autocommit
模式。
- 如果自动提交被禁用并且连接在提交之前终止,那么最后打开的 transaction is rolled back :
If a session that has autocommit disabled ends without explicitly committing the final transaction, MySQL rolls back that transaction.
注意,start 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 程序员没有在您的代码中看到显式回滚,他们可能也会有同样的问题。
关于php - 事务和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906687/