假设您在PHP中有两个SQL连接。 MySQLi对象。
$sql1
$sql2
两者都禁用了自动提交。
$sql1
从行中选择值并使用LOCK IN SHARE MODE锁定它们。
$sql2
根据$ sql1读取的输入执行插入和更新。
所以问题是:当连接的事务只执行SELECT时,$ sql1是否实际上锁定了该行。我问,因为仅在选择数据时使用交易是不正常的(据我所知)。
我需要$ sql1触及的行在$ sql2提交所有插入和更新之前不要更改。
我提交$ sql1以在$ sql2完成(并且已提交)之后释放锁,尽管$ sql1从未写过任何数据。它的设计是以这种方式工作吗?
我无法在同一个对象上执行此操作,因为插入和选择是由循环中的预准备语句执行的,需要两个不同的对象。
使用其他信息进行修改:
MySQL 5.6.22
隔离级别是默认值(REPEATABLE READ)
答案 0 :(得分:1)
我认为以下链接与您感兴趣的主题相关。答案必须考虑您使用自动提交禁用,REPEATABLE READ隔离级别和LOCK IN SHARED MODE。更改这些设置中的任何一个实际上最终会以不同的方式改变您的体验。
那就是说,我更习惯MS SQL Server,并且具有自动提交类型行为。而且,我非常熟悉,并且通常会期望选择取出共享锁。所以,对于“这是常见的”问题,我会说是的。
注意
使用SELECT FOR UPDATE锁定行以进行更新仅适用于 自动提交被禁用(通过START开始事务 TRANSACTION或通过将自动提交设置为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