-
1 # 網際網路技能圖譜
-
2 # 此生唯一
使用悲觀鎖set autocommit =0這個肯定是必須的!
先來看下什麼是悲觀鎖?悲觀鎖就是對資料操作持悲觀態度,為了防止資料併發時候對資料一致性的影響,對操作的資料進行加鎖的策略,通常為資料庫鎖級別!
怎麼使用資料庫悲觀鎖呢?
首先查詢語句為類似於select *where ID =# for update!然後做更新操作,最後使用commit提交事務!在這整個過程中,事務涉及到的資料都處於鎖定狀態,其餘的事務不能進行操作資料!由於捨棄了mysql的自動提交事務機制,改為手動提交,所以需要設定autoCommit =0,不然事務分步提交無法保證資料的一致性,失去了鎖的意義!
再來對比下樂觀鎖!
為什麼要有樂觀鎖?悲觀鎖嚴重的影響了資料庫效能的最大化,同時,使用資料庫鎖實現的悲觀鎖有很大的可能會有較長的事務鎖定期,影響併發環境中的訪問速度,而樂觀鎖是在資料確認提交的時候才對資料進行檢測如果發現衝突,由使用者本身自己去處理衝突,可以說是業餘端自己實現的鎖機制!
怎麼使用樂觀鎖?
一般在需要加鎖的資料上使用時間戳或者資料版本來控制資料的安全!
具體如下:比如說加版本version,事務一獲取到資料的時候version為1,事務二獲取到的時候也為1,但是,事務二優先修改了version變為version +1=2!這個時候事務一提交了,sql語句類似為update ....where version =#{version},但此時的版本已經變為2了,也就是說事務一的版本是過期的了,事務一的提交被駁回由程式進行處理!這樣來看每次的version修改都由一個事務提交,不會有資料的重複等問題!!使用時間戳的原理相同!
樂觀鎖在一定程度上,釋放了資料庫的效能,把資料一致性控制在業務程式碼中,有了更大的靈活性!
更多的技術分享,敬請持續關注。。。
回覆列表
使用什麼鎖是根據隔離級別和不同表加索引的情況來確定的。
例如:
主鍵:索引上鎖,資料行上鎖
唯一索引:索引上鎖,資料行上鎖
普通索引:會鎖住所有符合條件的索引和行,還會上間隙鎖
無索引:會鎖全表,逐漸釋放不符合條件的鎖
因此要儘可能只鎖需要的行,避免不同事務鎖住互相需要的行,造成死鎖。