2017-10-18 102 views
0

我想锁定MySQL(InnoDB)中的特定行,以便特定行不能被另一个连接读取。独占锁(行级) - MySql需要示例

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

我假设,锁获取的应用,然后试图访问同一行,必须等待,直到第一个连接第二连接释放锁与“提交”;

我的问题是,如何调整我的SQL语句以应用该锁?或者这是否会在开始交易时自动发生?

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

回答

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

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

任何其他人试图在同一行同时做同样的事情将等待您的COMMITROLLBACK,然后他们将收到行...与您所做的任何更改。

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

请注意,无论哪种方式,它在技术上不是“行”,它实际上是被锁定的索引记录,但在InnoDB中,“一切都是索引”(甚至一张没有索引的表格事实上仍然有一个由系统创建的索引),所以最终结果是一样的。