如果PHP PDO事务失败,我必须显式回滚吗?

7
我看过一个代码示例,其中有人执行了一个
$dbh->rollback();

当出现PDOException时,我认为数据库会自动回滚?


我相信事务将仅在数据库层面停止并过期,但是回滚(rollback())以节省一些数据库资源应该是一个好的实践。 - Emil Ivanov
1个回答

13
如果你在打开事务后没有进行提交(commit)或回滚(rollback),并且在脚本中没有其他地方进行提交(commit),那么这个事务就不会被数据库引擎所知道,并且会在脚本结束时自动回滚(rolled-back)。
不过,我几乎总是会显式地进行提交(commit)或回滚(rollback),原因如下:
1. 避免出现错误(例如在脚本后面“误提交”)的风险;
2. 代码更易于阅读和理解:当一个人看到$db->rollback()时,他知道我一定想让事务回滚,而不必思考“他真的想要回滚吗?还是他忘记了某些东西?后面的脚本又会怎样?”等问题。
数据库引擎无法“看到”PDO异常:它是由PHP在各种情况下抛出的——但数据库本身不会自动回滚任何操作:
- 要么提交事务(commit) - 要么回滚事务(rollback) - 要么既不提交也不回滚事务,这意味着事务没有提交(commit),也就是说已经修改的内容并没有“真正”被修改。

2
是的,即使它自动回滚,如果在脚本结束时只允许回滚发生,那将是非常糟糕的编码实践。如果有人稍后更改了代码,可能会出现错误。 - MindStalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接