独占锁(行级别)- MySql需要一个示例

3
我想在MySQL(InnoDB)中锁定特定的行,以便其他连接无法读取该行。
start transaction;
Select apples from fruit where apples = 'golden';
commit;

现在我想要申请一个排他锁。 排他锁 一种锁,可以防止其他事务锁定相同的行。

https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html#innodb-shared-exclusive-locks

我假设,锁被应用后,试图访问同一行的第二个连接必须等待第一个连接使用“commit;”释放锁定。

我的问题是,如何调整我的SQL语句以应用该锁定?或者这是否会自动发生在开始事务时?
我一直在尝试找到一个好的例子,但没有找到。
1个回答

7
START TRANSACTION;
Select apples 
  from fruit 
 where apples = 'golden'
   FOR UPDATE;
...
COMMIT;
SELECT ... FOR UPDATE语句首先锁定行,然后将其返回给您。如果有其他人试图同时对同一行进行相同的操作,则会等待您的COMMITROLLBACK,然后他们将接收该行……包括您所做的任何更改。
如果您没有意图更改该行,只是想确保没有其他人可以更改它,则可以使用SELECT ... LOCK IN SHARE MODE
请注意,无论如何,技术上并不是“行”,实际上是正在被锁定的索引记录,但在InnoDB中,“一切都是索引”(即使一个没有任何索引的表实际上仍然有一个由系统自动创建的索引),因此最终结果是相同的。

嗨 @Michael - sqlbot,阅读总是被允许的,无论行中是否有独占锁,对吗?我使用的是READ UNCOMMITTED级别,即使有独占锁,我仍然可以读取该行。显然会得到脏数据,但它仍然允许我这样做。这样可以吗,还是我有什么不理解的地方?- 提前感谢 - user19481364
我在谈论一个正常的读取(SELECT... FROM WHERE)@Michael - sqlbot。 - user19481364

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接