select 时进行update的操作,在高并发下引起死锁

Posted 25miao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select 时进行update的操作,在高并发下引起死锁相关的知识,希望对你有一定的参考价值。

场景:当用户查看帖子详情时,把帖子的阅读量:ReadCount+1

select title,content,readcount from post where id=‘xxxx‘   --根据主键查询帖子

update post set readcount=readcount+1 where id=‘xxxx‘

 

------------------------------为什么会出现死锁呢?---------------------------------

在网上找到一种说法:

就是说,某个query使用非聚集索引来select数据,那么它会在非聚集索引上持有一个S锁。当有一些select的列不在该索引上,它需要根据rowid找到对应的聚集索引的那行,然后找到其他数据。而此时,第二个的查询中,update正在聚集索引上忙乎:定位、加锁、修改等。但因为正在修改的某个列,是另外一个非聚集索引的某个列,所以此时,它需要同时更改那个非聚集索引的信息,这就需要在那个非聚集索引上,加第二个X锁。select开始等待update的X锁,update开始等待select的S锁,死锁,就这样发生鸟。

以上是关于select 时进行update的操作,在高并发下引起死锁的主要内容,如果未能解决你的问题,请参考以下文章

高并发下,HashMap会产生哪些问题?

Java--HashMap 在高并发下引起的死循环

为何要打印日志?C++在高并发下如何写日志文件(附源码)?

python 如何解决高并发下的库存问题??

解决Redis cluster的jedis驱动在高并发下的拥塞问题

通过乐观锁(版本号)降低并发时的锁竞争问题