首頁 >常見問題 >悲觀鎖是什麼?

悲觀鎖是什麼?

Guanhui
Guanhui原創
2020-06-28 09:52:594536瀏覽

悲觀鎖定指的是對資料被外界修改持保守態度,就是在資料處理過程中,將資料處於鎖定狀態,該功能需要依靠資料庫提供的鎖定機制,否則即使在系統中實現了加鎖機制,也無法保證外部系統不會修改資料。

悲觀鎖是什麼?

鎖定的模式

#LockMode.NONE

##無鎖機制

LockMode.READ

Hibernate在讀取記錄時自動取得鎖定

即共用鎖定:(Shared lock, S 鎖定),共享鎖又稱讀鎖。如果事務T 獲得了資料物件A 上的共享鎖(也就是說對A 加上共享鎖),那麼其他事務只能獲得A 上的共享鎖(S 鎖),而不能加排他鎖(X 鎖),直到A 釋放所有的共用鎖定。獲準共享鎖的事務只能讀數據,不能修改數據。

LockMode.WRITE

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

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

LockMode.UPGRADE

如果資料庫系統支援悲觀鎖定(如Oracle和MySQL),就執行select…for update語句(行級鎖定,其他交易不能對其進行update、insert和delete語句),如果資料庫不支援悲觀鎖(如Sybase),就執行普通的select語句。

LockMode.UPGRADE_NOWAIT

和LockMode.UPGRADE具有相同的功能。此外,對於Oracle資料庫執行select…for update nowait語句。 」nowait」表示如果執行該select語句的事務不能立刻獲得悲觀鎖,那麼不會等待其他事務釋放鎖,而是立刻拋出一個鎖定異常。

鎖定的示範

注意:鎖定只對一次事務中操作的資料物件起作用,並不是對整個資料庫起作用而將整個資料庫鎖住。

開啟兩個SQL指令操作行介面,這兩個介面可以代表兩個交易 T1 和 T2。我們先在兩個介面中分別執行指令:start transaction;

在事務T1 中在資料庫中查詢學號為「2015」 的學生資訊並對操作的資料加上悲觀鎖定:select * from stu_info where stu_no=”2015” for update;。此時我們能查詢對應的資訊。

“for update” 就表示加上悲觀鎖。這次查詢完並不提交事務,也就是說還未釋放鎖

在事務T2 中在資料庫中查詢學號為「2016」 的學生資訊並對操作的資料加上悲觀鎖定:select * from stu_info where stu_no=”2016” for update;。此時我們也能查詢對應的資訊。

尚不提交事務

在事務T2 中在資料庫中查詢學號為「2015」 的學生信息,此次做普通的select 查詢,不加鎖:select * from stu_info where stu_no=”2015”;。此時我們也能查詢對應的資訊。

尚不提交事務

在事務T2 中嘗試查詢資料庫中學號碼為“2015” 的學生資訊並對操作的資料加上悲觀鎖:select * from stu_info where stu_no=” 2015” for update;。此時我們能發現,並未顯示相關的訊息,而是在等待中。當我們提交事務 T1 時(即:commit),資料物件 “2015” 釋放 T1 中的悲觀鎖,T2 事務才能查詢到相關的資訊並取得到悲觀鎖。

如果我們換一下步驟5。在剛才的第五步中,我們在事務T1 中修改學號為「2016」學生資訊但是不加悲觀鎖,因為此前我們在事務T2 中對該記錄加了悲觀鎖還未釋放,所以,只有等T2 提交後才能修改成功。

推薦教學:《

MySQL教學

#

以上是悲觀鎖是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn