我花了很多时间来解决这个问题,而且这方面的PHP文档充其量是模糊的。我发现的一些事情,使用MySQL InnoDB表运行PHP 7:
PDO :: beginTransaction不只是关闭自动提交,测试了Olhovsky提供的答案,代码失败,回滚不起作用;没有交易行为。这意味着它不能这么简单。
开始一个事务可能会锁定已使用的表...我急切地等待有人告诉我我错了,但这里有原因:$db->beginTransaction();
$db->exec('LOCK TABLES t1, t2, ...');
# do something with tables
$db->commit();
$db->exec('UNLOCK TABLES');,它显示一个表在交易开始时无法访问,没有被锁定。 This comment,最后滑入:
...当交易处于活动状态时,您可以保证在您工作的过程中没有其他人可以进行更改
对我来说,这种行为非常聪明,并且还为PDO提供了足够的摆动空间来应对每个数据库,这毕竟是目标。如果这是正在发生的事情,它只是大量记录下来,应该被称为其他东西,以避免与真正的数据库事务混淆,这并不意味着锁定。
我认为查尔斯的答案可能是最好的,如果你确定需要高并发性的工作量;使用对数据库的显式查询手动完成,然后您可以通过数据库的文档。
更新我已经使用PDO事务功能启动并运行生产服务器一段时间了,最近使用AWS的Aurora数据库(与MySQL完全兼容但是可以自动扩展等)。我已经向自己证明了这两点:
事务(纯粹是一起提交所有数据库更改的能力)使用PDO :: beginTransaction()。简而言之,我知道许多脚本在数据库选择/更新的一半时间内已经失败,并且数据完整性得到了维护。
表锁定没有发生,我有一个索引重复错误来证明这一点。
因此,为了进一步得出结论,看起来这些函数的行为似乎基于数据库引擎(以及可能的其他因素)而改变。据我所知,从经验和文档中可以看出,没有办法以编程方式知道发生了什么......呐喊......