MySQL行级锁

Lil*_*ilo 2 mysql database innodb transactions locks

我不确定行级别锁如何工作但这里是我的问题我有一个表T(id int,balance int)(engine = InnoDB)我想要锁定ID = 1的行,所以我开始像这个 :

start transaction ; 
select * from T where ID = 1 FOR UPDATE ; 
Run Code Online (Sandbox Code Playgroud)

在发送提交之前,我想尝试确实行是否已锁定.所以我开始了另一个会话并输入:

UPDATE T set balance = balance  + 100 where ID = 1 ;
Run Code Online (Sandbox Code Playgroud)

在这里,我清楚地看到我在等待锁定(30秒后超时).

但是当我键入:

UPDATE T set balance = balance  + 8500 where ID = 2 ;
Run Code Online (Sandbox Code Playgroud)

我也在等待锁定,那么我怎样才能锁定ID = 1行而不是完全锁定表格?

Bar*_*mar 7

您需要在id列上添加索引以确保获得行级锁定.SELECT ... FOR UPDATE锁定所有读取的行以执行查询,而不仅仅是实际选择的行.如果没有索引,则必须执行全表扫描,因此每行都会被锁定.

使用索引,它只是在该索引条目中放置一个锁,它不必读取任何其他行,因此不会锁定其他行.