mysql事务死锁(间隙锁)
问题描述:
使用mysql5.5数据库,数据库隔离级别Repeatable Read
业务中有事务,进行下列的操作
1. update OrderAmount set Updatetime = now() , Status =0 where Orderid=#{orderId} and Status = 1
2. insert into OrderAmount (有可能多条)
table orderamount 有主键id,还建立了orderid,status的索引
发现偶尔会产生死锁,其中insert和update都会产生死锁。
询问dba后,dba说是mysql的间隙锁导致的问题。建议将数据库的隔离级别降低。
依照dba的意见,在程序中将数据库隔离级别降低为Read Commited后,在300个并发下,问题没有再现。
问题似乎解决,但确实没有理解。不知道大家是否碰到过相关的问题。
希望知道的大神给点指点。谢谢!
在mysql的innoDB存储引擎中,如果更新操作是针对一个区间的,那么它会锁住这个区间内所有的记录,比如update xxx where id between a and b那么它会锁住a到b之间所有记录,注意是所有记录,甚至这个记录并不存在也会被锁住,这个时候,如果另外一个连接需要插入一条记录到a到b之间,那么它就必须等到上一个事务结束。
update OrderAmount set Updatetime = now() , Status =0 where Orderid=#{orderId} and Status = 1
插入的数据如果有status=1的,就必须等update事务结束后才可以提交。