MySQL行级锁

时间:2016-09-23 16:02:36

标签: mysql database transactions innodb locks

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

start transaction ; 
select * from T where ID = 1 FOR UPDATE ; 

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

UPDATE T set balance = balance  + 100 where ID = 1 ;

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

但是当我输入时:

UPDATE T set balance = balance  + 8500 where ID = 2 ;

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

1 个答案:

答案 0 :(得分:7)

您需要在$arr = Array([0] => Array ( [...] => ... [...] => ... )[1] => Array ( [...] => ... [...] => ... )); $arr = (object) $arr; 列上添加索引,以确保获得行级锁定。 id锁定所有读取的行以执行查询,而不仅仅是实际选择的行。如果没有索引,则必须执行全表扫描,因此每行都会被锁定。

使用索引,它只是锁定该索引条目,它不必读取任何其他行,因此不会锁定其他行。