下一篇:共享鎖
學習電子書: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不了主鍵,而新增就判斷約束是否重復。
