在需要先读再写入的事务里,会出现读的数据被其他事务所更改,从而导致错误。这时可以在select语句后面添加for update达到锁的效果,但是for update默认是锁表的,这样会对性能有损耗,那么要怎样才能解决这个问题呢?
直接使用for update
事务A查询
结果
此时事务B查询
可以看出此时使用for update会对整表进行锁表操作。
WHERE条件使用主键或者唯一索引后
事务A查询
结果
此时事务B查询
可以看到被锁住的只有company_customer_manager_id为11的那一行。