为了好玩,我将应用程序中的mysqli扩展替换为PDO。
有时,我需要使用事务+表锁定。
根据mysql手册,在这些情况下,语法需要稍有不同。您可以这样做,而不是调用START TRANSACTION。
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;(http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)
我的问题是,这是如何与PDO::beginTransaction交互的?在这种情况下,我可以使用PDO::beginTransaction吗?或者我应该手动发送sql "SET autocommit = 0;... etc“。
谢谢你的建议,
发布于 2010-06-24 10:49:32
在MySQL中,由于锁定/解锁表的工作方式,开始事务与关闭自动提交是不同的。在MySQL中,锁表提交所有打开的事务,但是关闭自动提交实际上并不是启动事务。MySQL在这方面很有趣。
在PDO中,使用beginTransaction启动一个事务实际上并不会启动一个新事务,它只是关闭了自动提交。在大多数数据库中,这是合理的,但它可能会对MySQL提到的行为产生副作用。
您可能不应该依赖此行为以及它如何与MySQL的怪癖交互。如果你打算处理MySQL的表锁和DDL行为,你应该避免这样做。如果您想关闭自动提交,请手动将其关闭。如果要打开事务,请手动打开事务。
您可以自由地混合使用处理事务的PDO API方法和SQL命令,而不使用MySQL的奇特特性。
发布于 2012-11-19 21:36:52
当您调用PDO::beginTransaction()时,它会关闭自动提交。
所以你可以这样做:
$db->beginTransaction();
$db->exec('LOCK TABLES t1, t2, ...');
# do something with tables
$db->commit();
$db->exec('UNLOCK TABLES');在执行commit()或rollBack()之后,数据库将返回到自动提交模式。
发布于 2016-09-13 01:45:14
我在这个问题上花费了大量时间,这方面的PHP文档充其量也是含糊不清的。在使用MySQL InnoDB表运行PHP7时,我发现了一些东西:
PDO::beginTransaction不只是关闭自动提交,它已经用失败的代码测试了Olhovsky提供的答案,回滚不起作用;没有事务行为。这意味着它不可能这么简单。
开始事务时可能会锁定已使用的表...我热切地期待有人告诉我这是错误的,但可能的原因是:This comment,它显示当事务启动时,表在没有被锁定的情况下是不可访问的。This PHP documentation page,这是在结尾插入的:
...当事务处于活动状态时,可以保证当您工作到一半时,其他人不能进行更改
对我来说,这种行为非常聪明,也为PDO提供了足够的回旋余地来处理每个数据库,这毕竟是我的目标。但是,如果这就是实际发生的情况,那么它只是大量的文档不足,应该被称为其他名称,以避免与真正的数据库事务混淆,这并不意味着锁定。
我认为,如果您想确定需要高并发的工作负载,那么Charles的答案可能是最好的;使用显式的数据库查询手动完成,然后您可以参考数据库的文档。
AWS Update Aurora我已经使用事务函数启动并运行了一个生产服务器,最近使用的是AWS的数据库(与MySQL完全兼容,但构建为可自动扩展等)。我已经向自己证明了这两点:
因此,为了进一步说明我的结论,这些函数的行为似乎会根据数据库引擎(以及可能的其他因素)而发生变化。据我所知,从经验和文档上看,没有办法通过编程方式知道发生了什么……哇哦。
https://stackoverflow.com/questions/3106737
复制相似问题