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行而不是完全锁定表格?
您需要在id
列上添加索引以确保获得行级锁定.SELECT ... FOR UPDATE
锁定所有读取的行以执行查询,而不仅仅是实际选择的行.如果没有索引,则必须执行全表扫描,因此每行都会被锁定.
使用索引,它只是在该索引条目中放置一个锁,它不必读取任何其他行,因此不会锁定其他行.