什麼是鎖?
鎖是在併發情況下控制操作的順序執行,以此保證資料安全的變動。
悲觀鎖:
認為被他保護的資料是極其不安全的,隨時都可能發生改變,乙個事務拿到悲觀鎖後,其他任何事務都不能對該資料進行修改,只能等待鎖被釋放才可以執行。
資料庫中的行鎖、表鎖、讀鎖、寫鎖以及以synchronized實現的鎖都是悲觀鎖
悲觀鎖的實現方式
一般使用 select ****** for update 進行加鎖操作,當乙個事務使用這種方式進行了加鎖操作後,會對資料庫中的表或某些行資料進行鎖定,鎖定規則:
select * from user for update 是鎖表
select * from user limit 0,1 for update 鎖定查詢出的資料
select * from user where id = 1 for update id是主鍵,鎖定查詢出的資料
select * from user where name='張三' for update name不是主鍵,鎖定整張表
select * from user where name='張三' limit 0,1 for update name不是主鍵,鎖定查詢出的資料
當鎖定了某些行資料時候,其他的事務(主要是dml語句)不能對鎖定的資料進行操作,但是查詢語句(dql語句)是可以進行查詢的,注意查詢語句不能有 for update ,因為這會去有進行加鎖操作,
只會等待當前事務釋放悲觀鎖後,下乙個事務才會進行操作,當然如果有等待過期時間也會導致報錯出現。
悲觀鎖通過兩個視窗來測試結果如下:
樂觀鎖:
樂觀鎖「樂觀」地認為資料不會頻繁的變動,可以多個事務同時對資料進行修改,那麼如何保證資料的順序變動呢,樂觀鎖通常是在表中新增乙個版本欄位version或者時間戳timestamp;以時間戳舉例,當有事務開始時,取出時間戳 t1,當完成改動資料後,需要再次查出對應的時間戳 t2, 如果 t1=t2,就說明資料改動期間,沒有其他事務對該資料進行了修改,就允許此次對資料的更改,同時更新時間戳字段的值,如果 t1 不等於 t2,說明其他事務已經對此資料進行了修改,那麼不允許本次修改更新到表中,本次更新失敗。
悲觀鎖和樂觀鎖
1.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
悲觀鎖和樂觀鎖
前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...
悲觀鎖和樂觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...