悲观锁,乐观锁
樂觀鎖與悲觀鎖
北京這兩天天氣不好,時晴時陰,最近有有點累,所以在家里休息了兩天,看了一下樂觀鎖與悲觀鎖,雖然沒有茅塞頓開,但是也有點收獲。
先想一想為什么要使用鎖?
在用戶訪問你的網站時,同一時間可能會有多個用戶更新相同的記錄,這時候他們同時訪問數據庫,這就會產生沖突,這就是著名的并發(高并發)。
高并發會產生什么后果呢?
丟失更新:一個事務的更新覆蓋了其他事務的更新,這就是所謂的更新丟失。列如管理員A把數據庫中的2改成了6,管理員B把值從6又改成了2,這個時候,用戶A就丟失了他的更新。
臟讀 :當一個事務讀取其他完成一半事務的記錄時,就會發生臟讀,列如:管理員AB讀取數據庫時看到的都是6 ,用戶B把值改為2,用戶A讀取到的值仍是6 .
超賣: 如果maysql中沒有鎖的存在的話,他會產生超賣的情況,你庫存只有十個,但是一百個用戶同時去訪問你的數據庫,這時候就會產生超賣。可能你就會賣出12件商品。
解決高并發的方法:
- 悲觀鎖: 假設會發生并發沖突,屏蔽一切可能違反數據完整性的操作, 認為會多人操作同一條數據,因此操作數據時直接把數據鎖住,直到一個人操作完成后才會釋放鎖;上鎖期間其他人不能修改數據。
- 樂觀鎖: 假設不會發生并發沖突,只在操作時檢查是否違反數據完整性,如果別人修改了數據則放棄操作,否則執行操作。而樂觀鎖不能解決臟讀,因為他在操作時才會去檢查,而臟讀是在操作中產生的。
- 版本號機制:??MySql最經常使用的樂觀鎖時進行版本控制,也就是在數據庫表中增加一列,記為version,當我們將數據讀出時,將版本號一并讀出,當數據進行更新時,會對這個版本號進行加1,當我們提交數據時,會判斷數據庫表中當前的version列值和當時讀出的version是否相同,若相同說明沒有進行更新的操作,不然,則取消這次的操作
總結::在實際生產環境里邊,如果并發量不大且不允許臟讀,可以使用悲觀鎖解決并發問題;但如果系統的并發非常大的話,悲觀鎖定會帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法.
轉載于:https://www.cnblogs.com/lowbi/p/11022610.html
總結
- 上一篇: Ubuntu 开机 Firmware B
- 下一篇: 电子邮件技术基础