我不确定行级锁是如何工作的,但这里是我的问题我有一个表T (id int,balance int )(引擎= InnoDB ),我想锁定ID = 1的行,所以我像这样启动了一个事务:
start transaction ;
select * from T where ID = 1 FOR UPDATE ; 在发送commit之前,我想尝试一下行是否真的被锁定。因此,我启动了另一个会话,并键入:
UPDATE T set balance = balance + 100 where ID = 1 ;在这里我清楚地看到我在等待锁( 30秒后超时)。
但是当我输入的时候:
UPDATE T set balance = balance + 8500 where ID = 2 ;我也在等待锁定,那么我怎么能只锁定ID =1的行而不锁定整个表呢?
发布于 2016-09-24 02:21:05
您需要在id列上添加索引,以确保获得行级锁。SELECT ... FOR UPDATE锁定为执行查询而读取的所有行,而不仅仅是实际选择的行。如果没有索引,它必须执行全表扫描,因此每一行都会被锁定。
对于索引,它只需在该索引条目中设置一个锁,而不必读取任何其他行,因此不会锁定任何其他行。
https://stackoverflow.com/questions/39665093
复制相似问题