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

Hen*_*nry 3 mysql locking transactions

我想锁定 MySQL (InnoDB) 中的特定行,以便其他连接无法读取该特定行。

start transaction;
Select apples from fruit where apples = 'golden';
commit;
Run Code Online (Sandbox Code Playgroud)

现在我想申请一个独占锁

排他锁 一种防止任何其他事务锁定同一行的锁。

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

我假设,应用了锁,然后尝试访问同一行的第二个连接必须等到第一个连接通过“commit;”释放锁。

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

我一直在努力寻找一个好的例子,但还没有找到。

Mic*_*bot 8

START TRANSACTION;
Select apples 
  from fruit 
 where apples = 'golden'
   FOR UPDATE;
...
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

尝试同时对同一行执行相同操作的其他人将等待您的COMMITROLLBACK然后他们将收到该行...以及您所做的任何更改。

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

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