我不确定行级别锁定如何工作但这是我的问题 我有一个表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行而不是完全锁定表格呢?
答案 0 :(得分:7)
您需要在$arr = Array([0] => Array
(
[...] => ...
[...] => ...
)[1] => Array
(
[...] => ...
[...] => ...
));
$arr = (object) $arr;
列上添加索引,以确保获得行级锁定。 id
锁定所有读取的行以执行查询,而不仅仅是实际选择的行。如果没有索引,则必须执行全表扫描,因此每行都会被锁定。
使用索引,它只是锁定该索引条目,它不必读取任何其他行,因此不会锁定其他行。