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

时间:2017-10-18 14:20:07

标签: mysql transactions locking

我想锁定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

我假设,锁定get已应用,然后第二个连接尝试访问同一行,必须等到第一个连接释放锁定时出现“commit;”

我的问题是,如何调整我的SQL语句以应用该锁定?或者这是否会在启动事务中自动发生?

我一直试图找到一个很好的例子而没有。

1 个答案:

答案 0 :(得分:1)

START TRANSACTION;
Select apples 
  from fruit 
 where apples = 'golden'
   FOR UPDATE;
...
COMMIT;

SELECT ... FOR UPDATE语句首先锁定该行,然后将其返回给您。

其他任何尝试同时对同一行执行相同操作的人都会等待您的COMMITROLLBACK,然后他们会收到行...并进行任何更改。

如果您无意更改行,您只想确保其他人无法更改,那么您可以SELECT ... LOCK IN SHARE MODE

请注意,无论哪种方式,它在技术上不是“行”,它实际上是被锁定的索引记录,但在InnoDB中,“一切都是索引”(即使是根本没有索引的表确实仍然有一个索引,由系统创建,因此最终结果是相同的。