加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 交易和例外

发布时间:2020-12-13 16:09:04 所属栏目:PHP教程 来源:网络整理
导读:我想我会问,因为我不确定这个操作的结果是不是原始性质的交易. 当PHP中抛出异常停止执行时,如何处理数据库事务.是否会自动回滚,因为从PHP中删除了与数据库的连接,或者锁定是否仍然存在? 伪代码 TX BeginSelect BalanceLogic in PHP Exception RollbackCommi
我想我会问,因为我不确定这个操作的结果是不是原始性质的交易.

当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程序员可能会有同样的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读