php - 事务和异常

标签 php mysql

我想我会问,因为我不确定这个操作的结果没有处理原始性质的事务。

当 PHP 抛出异常停止执行时,DB 事务是如何处理的。它会自动回滚,因为与数据库的连接已从 PHP 中删除,还是会保持锁定状态?

伪代码

TX Begin
Select Balance
Logic in PHP
  Exception 
  Rollback
Commit

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

最佳答案

要确定当连接( session )终止时 MySQL 如何处理事务,我们必须考虑是否启用了 autocommit 模式。

  1. 如果自动提交被禁用并且连接在提交之前终止,那么最后打开的 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.

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

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

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

相关文章:

mysql - 电源故障和mysql崩溃

mysql查看超慢

php - 如何使用 CakePhp 克隆/复制一条 sql 记录?

php - 选择与日期选择器中相同的日期

mysql - 如何设计一个简单高效的MySQL黑名单表

php - 什么更消耗资源?每次存储或读取

php - Yii : Products with MANY_MANY categories and categories may or not has parent. 获取所有产品

javascript - 如何在不知道文件名的情况下指定下载文件夹?

php - .htaccess php_value display_errors 设置因错误 500 而中断

PHP变量替换