溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是悲觀鎖

發(fā)布時間:2020-07-31 10:52:59 來源:億速云 閱讀:173 作者:Leah 欄目:互聯(lián)網(wǎng)科技

什么是悲觀鎖?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

悲觀鎖指的是對數(shù)據(jù)被外界修改持保守態(tài)度,就是在數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài),該功能需要依靠數(shù)據(jù)庫提供的鎖機(jī)制,否則即使在系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù)。

鎖的模式

LockMode.NONE

無鎖機(jī)制

LockMode.READ

Hibernate在讀取記錄時自動獲取鎖

即共享鎖:(Shared lock, S 鎖),共享鎖又稱讀鎖。如果事務(wù) T 獲得了數(shù)據(jù)對象 A 上的共享鎖(也就是說對 A 加上共享鎖),那么其他事務(wù)只能獲得 A 上的 共享鎖(S 鎖),而不能加排他鎖(X 鎖),直到 A 釋放所有的共享鎖。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)。

LockMode.WRITE

Hibernate在insert獲者update記錄時自動獲取鎖

即排他鎖:(Exclusive lock, X 鎖),排他鎖又稱寫鎖。如果事務(wù) T 獲得了數(shù)據(jù) A 上的排他鎖,那么 T 既可以讀又可以寫 A,但是在 T 釋放 A 上的 X 鎖之前,其他事務(wù)既不能獲得 A 上的共享鎖,也不能獲得 A 上的排他鎖。

LockMode.UPGRADE

如果數(shù)據(jù)庫系統(tǒng)支持悲觀鎖(如Oracle和MySQL),就執(zhí)行select…for update語句(行級鎖住,其他事務(wù)不能對其進(jìn)行update、insert和delete語句),如果數(shù)據(jù)庫不支持悲觀鎖(如Sybase),就執(zhí)行普通的select語句。

LockMode.UPGRADE_NOWAIT

和LockMode.UPGRADE具有相同的功能。此外,對于Oracle數(shù)據(jù)庫執(zhí)行select…for update nowait語句。”nowait”表示如果執(zhí)行該select語句的事務(wù)不能立刻獲得悲觀鎖,那么不會等待其他事務(wù)釋放鎖,而是立刻拋出一個鎖定異常。

鎖的演示

注意:鎖只對一次事務(wù)中操作的數(shù)據(jù)對象起作用,并不是對整個數(shù)據(jù)庫起作用而將整個數(shù)據(jù)庫鎖住。

打開兩個SQL命令操作行界面,這兩個界面可以代表兩個事務(wù) T1 和 T2。我們先在兩個界面中分別執(zhí)行命令:start transaction;

在事務(wù) T1 中在數(shù)據(jù)庫中查詢學(xué)號為 “2015” 的學(xué)生信息并對操作的數(shù)據(jù)加上悲觀鎖:select * from stu_info where stu_no=”2015” for update;。此時我們能查詢到對應(yīng)的信息。

“for update” 就表示加上悲觀鎖。此次查詢完并不提交事務(wù),也就是說還未釋放鎖

在事務(wù) T2 中在數(shù)據(jù)庫中查詢學(xué)號為 “2016” 的學(xué)生信息并對操作的數(shù)據(jù)加上悲觀鎖:select * from stu_info where stu_no=”2016” for update;。此時我們也能查詢到對應(yīng)的信息。

尚不提交事務(wù)

在事務(wù) T2 中在數(shù)據(jù)庫中查詢學(xué)號為 “2015” 的學(xué)生信息,此次做普通的 select 查詢,不加鎖:select * from stu_info where stu_no=”2015”;。此時我們也能查詢到對應(yīng)的信息。

尚不提交事務(wù)

在事務(wù) T2 中嘗試查詢數(shù)據(jù)庫中學(xué)號為 “2015” 的學(xué)生信息并對操作的數(shù)據(jù)加上悲觀鎖:select * from stu_info where stu_no=”2015” for update;。此時我們能發(fā)現(xiàn),并未顯示相關(guān)的信息,而是在等待中。當(dāng)我們提交事務(wù) T1 時(即:commit),數(shù)據(jù)對象 “2015” 釋放 T1 中的悲觀鎖,T2 事務(wù)才能查詢到相關(guān)的信息并獲取到悲觀鎖。

如果我們換一下步驟5。在剛才的第五步中,我們在事務(wù) T1 中修改學(xué)號為 “2016”學(xué)生信息但是不加悲觀鎖,因?yàn)榇饲拔覀冊?事務(wù) T2 中對該記錄加了悲觀鎖還未釋放,所以,只有等 T2 提交后才能修改成功。


關(guān)于什么是悲觀鎖問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI