MySQL的for update使用(行级锁)

在默认的MySQL查询操作是不添加锁的

在需要先读再写入的事务里,会出现读的数据被其他事务所更改,从而导致错误。这时可以在select语句后面添加for update达到锁的效果,但是for update默认是锁表的,这样会对性能有损耗,那么要怎样才能解决这个问题呢?

直接使用for update

事务A查询
MySQL的for update使用(行级锁)
结果
MySQL的for update使用(行级锁)
此时事务B查询
MySQL的for update使用(行级锁)
MySQL的for update使用(行级锁)
可以看出此时使用for update会对整表进行锁表操作。

WHERE条件使用主键或者唯一索引后

事务A查询
MySQL的for update使用(行级锁)
结果
MySQL的for update使用(行级锁)
此时事务B查询
MySQL的for update使用(行级锁)
MySQL的for update使用(行级锁)
可以看到被锁住的只有company_customer_manager_id为11的那一行。