首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO、mysql、事务和表锁

问PDO、mysql、事务和表锁
EN

Stack Overflow用户
提问于 2010-06-24 09:44:43
回答 3查看 16.6K关注 0票数 17

为了好玩,我将应用程序中的mysqli扩展替换为PDO。

有时,我需要使用事务+表锁定。

根据mysql手册,在这些情况下,语法需要稍有不同。您可以这样做,而不是调用START TRANSACTION。

代码语言:javascript
复制
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“。

谢谢你的建议,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-24 10:49:32

在MySQL中,由于锁定/解锁表的工作方式,开始事务与关闭自动提交是不同的。在MySQL中,锁表提交所有打开的事务,但是关闭自动提交实际上并不是启动事务。MySQL在这方面很有趣。

在PDO中,使用beginTransaction启动一个事务实际上并不会启动一个新事务,它只是关闭了自动提交。在大多数数据库中,这是合理的,但它可能会对MySQL提到的行为产生副作用。

您可能不应该依赖此行为以及它如何与MySQL的怪癖交互。如果你打算处理MySQL的表锁和DDL行为,你应该避免这样做。如果您想关闭自动提交,请手动将其关闭。如果要打开事务,请手动打开事务。

您可以自由地混合使用处理事务的PDO API方法和SQL命令,而不使用MySQL的奇特特性。

票数 6
EN

Stack Overflow用户

发布于 2012-11-19 21:36:52

当您调用PDO::beginTransaction()时,它会关闭自动提交。

所以你可以这样做:

代码语言:javascript
复制
$db->beginTransaction();
$db->exec('LOCK TABLES t1, t2, ...');
# do something with tables
$db->commit();
$db->exec('UNLOCK TABLES');

在执行commit()或rollBack()之后,数据库将返回到自动提交模式。

票数 10
EN

Stack Overflow用户

发布于 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完全兼容,但构建为可自动扩展等)。我已经向自己证明了这两点:

  • Transactions (纯粹的提交所有数据库更改的能力)使用PDO::beginTransaction()。简而言之,我知道许多脚本在数据库选择/更新中途失败,数据完整性maintained.
  • Table锁定没有发生,我有一个索引复制错误证明了这一点。

因此,为了进一步说明我的结论,这些函数的行为似乎会根据数据库引擎(以及可能的其他因素)而发生变化。据我所知,从经验和文档上看,没有办法通过编程方式知道发生了什么……哇哦。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3106737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档