Oracle鎖-行級排他鎖(一)


下一篇:共享鎖

學習電子書:https://docs.oracle.com/cd/E18283_01/server.112/e16508/consist.htm#CNCPT1339

什么是排它鎖?

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

什么是行級排他鎖?

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

實戰:

這里有一個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不了主鍵,而新增就判斷約束是否重復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM