我想锁定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语句以应用该锁定?或者这是否会在启动事务中自动发生?
我一直试图找到一个很好的例子而没有。
答案 0 :(得分:1)
START TRANSACTION;
Select apples
from fruit
where apples = 'golden'
FOR UPDATE;
...
COMMIT;
SELECT ... FOR UPDATE
语句首先锁定该行,然后将其返回给您。
其他任何尝试同时对同一行执行相同操作的人都会等待您的COMMIT
或ROLLBACK
,然后他们会收到行...并进行任何更改。
如果您无意更改行,您只想确保其他人无法更改,那么您可以SELECT ... LOCK IN SHARE MODE
。
请注意,无论哪种方式,它在技术上不是“行”,它实际上是被锁定的索引记录,但在InnoDB中,“一切都是索引”(即使是根本没有索引的表确实仍然有一个索引,由系统创建,因此最终结果是相同的。