最近作一個統計;須要把一個字段(存放數據是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
若是對讀的響應度要求很是高,好比證券交易系統,那麼適合用樂觀鎖,由於悲觀鎖會阻塞讀
若是讀遠多於寫,那麼也適合用樂觀鎖,由於用悲觀鎖會致使大量讀被少許的寫阻塞
若是寫操做頻繁而且衝突比例很高,那麼適合用悲觀寫獨佔鎖