Oracle鎖 行級排他鎖(一)

2022-02-03 20:00:58 字數 1674 閱讀 5349

學習電子書:

什麼是排它鎖?

每乙個事務在修改資源時會獲得排他鎖,該事務不結束,則其他事務不能修改此資源。(注意:這裡的修改不是資料「增刪查改」中的改。資料是資源的一種,可以先理解為修改資料。第乙個事務修改資源,第乙個事務就先占有排他鎖)。

什麼是行級排他鎖?

針對行資料修改,事務占有的排他鎖,稱作行級排它鎖(或排他的行鎖,或粒度為行的排它鎖)。行資料修改的修改不是指資料內容的修改,它是指新增行,刪除行,修改行內容。

實戰:這裡有乙個bank表,主鍵是id。下面的部分例子以當前存在的id=2的行進行說明。

第一種行修改:某乙個事務刪除行,其他事務不能新增該行,修改該行內容,刪除該行。

開啟乙個視窗,針對id=2的行,執行刪除操作,不commit也不rollback。(乙個視窗就是乙個事務)

開啟另乙個視窗,單獨執行下面每一條語句,你會發現它都在executing。

update bank set

money

=8000

where id=2;

insert

into bank values (2,8000); --

主鍵一樣

delete

from bank b where b.id=

2;

第二種行修改:某事務新增一行資料,另外的事務新增主鍵相同的行,則會等待排它鎖的釋放。

乙個視窗執行 insert into bank values (900,8000)。另乙個視窗單獨執行下面的每一句sql。(每重新自測一句sql,都要把當前事務結束掉再重新開始。)

--以下的新增操作需要等待

delete

from bank b where b.id=

900; --

0條刪除,原本表裡就沒有這條記錄

update bank set

money

=8000

where id=

900; --

0條修改,原本表裡就沒有這條記錄

--executing,因為可以commit意味著就要成功插入,

--但另外的事務也加了相同主鍵的行,所以會等跟自己衝突的那行的排它鎖釋放。

insert

into bank values (900,8000);

第三種行修改:某事務修改一行資料,另外的事務修改、刪除相同的行,則會等待排他鎖的釋放。

--

另乙個事務修改id為2的資料 update bank b set money=900 where b.id=2

update bank set

money

=8000

where id=

2; --

等待delete

from bank b where b.id=

2; --

等待insert

into bank values (2,8000); --

不等待,因為另外的事務update不了主鍵,而新增就判斷約束是否重複。

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...