學習電子書:https://docs.oracle.com/cd/E18283_01/server.112/e16508/consist.htm#CNCPT1339 什麼是排它鎖? 每一個事務在修改資源時會獲得排他鎖,該事務不結束,則其他事務不能修改此資源。(註意:這裡的修改不是數據“增刪查改”中的 ...
學習電子書: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不了主鍵,而新增就判斷約束是否重覆。