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个并发下,问题没有再现。

问题似乎解决,但确实没有理解。不知道大家是否碰到过相关的问题。

希望知道的大神给点指点。谢谢!

 

 

 

 

 

0

在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事务结束后才可以提交。 


分享到: 微信 更多