查询中需要用到一个频繁被更新的表A,且查询是用的模糊查询,不走索引。
当查询遇上表A需要更新时就会产生死锁。
查找网上各种资料,大概意思是查询时没有走索引,所以锁升级到了表锁定,需要更新的表A被加了共享锁S,当另一个事务需要更新表A时,不能再加锁,导致了死锁。
请问有什么办法可以避免呢?或者可不可以让mysql执行查询时不加共享锁,这样表A就可以随时更新。
对数据库不是很熟,希望了解的朋友帮忙分析一下。
谢谢!!!
3 个解决方案
#1
设置查询的session的tx_isolation为REPEATABLE-READ
set tx_isolation='READ-UNCOMMITTED';
set tx_isolation='READ-UNCOMMITTED';
#2
mysql本身就是mvcc多版本并发控制,直接select不会加锁的
#3
由于MDL_SHARED_WRITE与MDL_SHARED_READ兼容,所以它们不会因为MDL而导致等待的情况
#1
设置查询的session的tx_isolation为REPEATABLE-READ
set tx_isolation='READ-UNCOMMITTED';
set tx_isolation='READ-UNCOMMITTED';
#2
mysql本身就是mvcc多版本并发控制,直接select不会加锁的
#3
由于MDL_SHARED_WRITE与MDL_SHARED_READ兼容,所以它们不会因为MDL而导致等待的情况