Mysql 先SELECT 後UPDATE 問題

最近作一個統計;須要把一個字段(存放數據是json)裏某一個數字加1 而後在修改該字段;當時就那麼一寫最後發現該數據和明細對不上; 其實這個應該是併發引發的,先select 在update 這樣寫其實會出現一些問題html

參考篇文章mysql

###第一種解決方案sql

事務,即用一個事務來包裹上面的SELECT+UPDATE操做+寫共享鎖。json

讀共享鎖是經過下面這樣的SQL得到的:SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;併發

若是事務A得到了先得到了讀共享鎖,那麼事務B以後仍然能夠讀取加了讀共享鎖的行數據,但必須等事務A commit或者roll back以後才能夠更新或者刪除加了讀共享鎖的行數據。學習

若是事務A先得到了某行的寫共享鎖,那麼事務B就必須等待事務A commit或者roll back以後才能夠訪問行數據。.net

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

###第二種解決方案code

樂觀鎖,上面是一種觀鎖機制,並且SELECT...FOR UPDATE方式也不太經常使用htm

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1 WHERE counter_field='上面select出來的值' ;

這樣能夠根據UPDATE返回值來判斷是否更新成功,若是返回值是0則代表存在併發更新,那麼只須要重試一下就行了。blog

  1. 若是對讀的響應度要求很是高,好比證券交易系統,那麼適合用樂觀鎖,由於悲觀鎖會阻塞讀

  2. 若是讀遠多於寫,那麼也適合用樂觀鎖,由於用悲觀鎖會致使大量讀被少許的寫阻塞

  3. 若是寫操做頻繁而且衝突比例很高,那麼適合用悲觀寫獨佔鎖

mysql鎖相關學習

相關文章
相關標籤/搜索