S鎖:S鎖也叫共享鎖,讀鎖,數據只能被讀取不能被修改.
X鎖:X鎖也叫排他鎖,寫鎖,一個事務對表加鎖后,其他事務就不能對其進行加鎖與增刪查改操作.
樂觀鎖:總是假設是最好的情況,每次去操作的時候都不會上鎖,但在更新時會判斷有沒有其他操作去更新這個數據。
通俗講就是我很樂觀,我認為你拿走我的數據是不會進行更改的,但是為了保險起見,最后你把數據還給我的時候我得去看一下數據有沒有真的被修改。
mysql本身沒有提供樂觀鎖的支持,需要自己來實現,常用的方法是版本控制和時間戳控制兩種.
版本控制:版本控制就是為表增加一個version字段,讀取數據時連同這個version字段一起讀出來,之后進行更新操作,版本號加1,
再將提交的數據的版本號與數據庫中的版本號進行比較,若提交的數據的版本號大於數據庫中的版本號才會進行更新.
比如說剛開始的時候數據庫的版本是1,A事務拿到的版本也是1,B事務拿到的版本也是1,之后A事務進行更新后,版本變成2,B事務也對其進行更新后版本變成2,但是A事務提交了,此時版本2大於1,事務可以操作成功,
此時數據庫版本變成了2,而B事務提交后,B事務的數據庫版本和數據庫版本一樣,所以不允許提交事務。時間控制和版本控制類似
悲觀鎖:總是假設最壞的情況,在整個數據處理狀態中數據處於鎖定狀態,悲觀鎖的實現往往依靠數據庫的鎖機制.每次在拿到數據前都會上鎖.
通俗的說我很悲觀,你拿到我的數據就是要該我的數據,我就要對數據庫數據加鎖
事務A對數據庫進行操作時,這時數據庫會被加上鎖,其他事務來都會進行等待,一直到事務A操作完成,數據庫鎖才會被釋放,這時后面的事務才可以進行