學習電子書:
什麼是排它鎖?
每乙個事務在修改資源時會獲得排他鎖,該事務不結束,則其他事務不能修改此資源。(注意:這裡的修改不是資料「增刪查改」中的改。資料是資源的一種,可以先理解為修改資料。第乙個事務修改資源,第乙個事務就先占有排他鎖)。
什麼是行級排他鎖?
針對行資料修改,事務占有的排他鎖,稱作行級排它鎖(或排他的行鎖,或粒度為行的排它鎖)。行資料修改的修改不是指資料內容的修改,它是指新增行,刪除行,修改行內容。
實戰:這裡有乙個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 悲...