首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在共享模式下写入SQL连接以触发锁定

在共享模式下写入SQL连接以触发锁定
EN

Stack Overflow用户
提问于 2015-05-21 19:23:05
回答 1查看 163关注 0票数 0

假设您在PHP中有两个SQL连接。MySQLi对象。

代码语言:javascript
复制
$sql1
$sql2

两者都禁用了自动提交。

$sql1从行中选择值,并在共享模式下使用LOCK锁定它们。

$sql2根据$sql1读取的输入执行插入和更新。

那么问题来了:当连接的事务只执行SELECT时,$sql1是否真的锁定了行?我之所以这样问,是因为在仅选择数据时使用事务是不正常的(据我所知)。

我需要在$sql2提交所有插入和更新之前,$sql1接触到的行不会更改。

在$sql2完成(并提交)之后,我对$sql1执行了一次提交,以释放锁,尽管$sql1从未写入任何数据。它是这样设计的吗?

我不能在同一个对象上这样做,因为inserts和selects是由循环中的预准备语句执行的,需要两个不同的对象。

使用其他信息进行编辑:

MySQL 5.6.22

隔离级别为默认值(可重复读取)

EN

回答 1

Stack Overflow用户

发布于 2015-05-21 21:49:31

我认为下面的链接与您感兴趣的主题相关。答案必须考虑到您使用的是禁用自动提交、可重复读取隔离级别和锁定在共享模式中。改变这些设置中的任何一个实际上都会以不同的方式改变你的体验。

也就是说,我更习惯于MS SQL Server和自动提交类型的行为。尽管如此,我仍然非常熟悉,并且通常会期望selects删除共享锁。所以,对于“这是常见的”这个问题,我会说“是”。

说明

使用SELECT for update锁定UPDATE行仅适用于禁用自动提交(通过以START transaction开始TRANSACTION或将autocommit设置为0 )的情况。如果启用了自动提交,则不会锁定与规范匹配的行。

https://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

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

https://stackoverflow.com/questions/30372305

复制
相关文章

相似问题

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