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

ope*_*rog 6 php mysql pdo

我见过一个代码示例,其中有人做了

$dbh->rollback();
Run Code Online (Sandbox Code Playgroud)

当发生PDOException时.我以为数据库会在这种情况下自动回滚?

Pas*_*TIN 12

如果您commit不是rollback一个已打开的事务,并且它不在commited您的脚本的后面,它将不会commited (如数据库引擎所见),并将在脚本结束时自动回滚.


不过,我(好吧,差不多)总是commitrollback明确地说我打开的交易,所以:

  • 没有错误的风险(比如在脚本后面"错误地"提交)
  • 代码更容易阅读/理解:当一个人看到时$db->rollback(),他知道我希望事务回滚肯定,而且他不必考虑" 他真的想要回滚,还是他忘记了什么?"关于后来的剧本? "


数据库引擎没有"看到"PDOException:PHP在各种条件下抛出它 - 但数据库本身不回滚任何东西:

  • 要么提交一个事务
  • 或者它是回滚的
  • 或者它没有显式提交或回滚 - 这意味着它没有被提交 - 这意味着被修改的内容并未"真正"修改

  • 是的,即使它自动回滚,在脚本结束时让回滚发生也是非常糟糕的编码习惯.如果有人稍后更改了代码,则可能存在错误. (2认同)