1. 程式人生 > >select 時進行update的操作,在高並發下引起死鎖

select 時進行update的操作,在高並發下引起死鎖

xxxx 數據 高並發 select 聚集索引 操作 加鎖 content 其他

場景:當用戶查看帖子詳情時,把帖子的閱讀量: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的操作,在高並發下引起死鎖