對數(shù)據(jù)庫稍有了解的人,數(shù)據(jù)庫使用排他鎖X鎖來避免兩個事務(wù)同時修改同一條數(shù)據(jù),同時使用較低級別如行上加鎖來提高并發(fā)度。
以下了兩種場景很容易理解:
1>事務(wù)1執(zhí)行 UPDATE TB1 SET C2=1 WHERE C1=1(此處假設(shè)C1為主鍵,使用行鎖),事務(wù)1未提交,而后事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=1,事務(wù)2必須等到事務(wù)1提交或回滾后,才能獲得對該行數(shù)據(jù)的X鎖;
2>事務(wù)1執(zhí)行 UPDATE TB1 SET C2=1 WHERE C1=1(此處假設(shè)C1為主鍵,使用行鎖),事務(wù)1未提交,而后事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=2,由于事務(wù)1和2修改的數(shù)據(jù)行不同,因此事務(wù)1和事務(wù)2不會阻塞;
但對于以下兩種場景就有些難理解:
1>事務(wù)1執(zhí)行 UPDATE TB1 SET C1=11 WHERE C1=1(此處假設(shè)C1為主鍵,使用行鎖),事務(wù)1未提交,而后事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=11,數(shù)據(jù)行在事務(wù)1更新前不滿足事務(wù)2的更新條件,但數(shù)據(jù)行在事務(wù)1更新后又滿足事務(wù)2的更新條件,事務(wù)2會被事務(wù)1阻塞么?
測試結(jié)果:會被阻塞
測試代碼:
DROP TABLE dbo.TB1GOCREATE TABLE TB1( C1 INT, C2 INT)GOCREATE UNIQUE CLUSTERED INDEX IDX_C1ON dbo.TB1( C1)GOINSERT INTO dbo.TB1( C1, C2 )SELECT 1,1UNIONSELECT 2,2UNIONSELECT 3,3UNIONSELECT 4,4GO事務(wù)1開始執(zhí)行,修改數(shù)據(jù)行但未提交;BEGIN TRANUPDATE dbo.TB1SET C1=11WHERE C1=1在新會話中事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=11View Code
2>事務(wù)1執(zhí)行 UPDATE TB1 SET C1=11 WHERE C1=1(此處假設(shè)C1為主鍵,使用行鎖),事務(wù)1未提交,而后事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=1,數(shù)據(jù)行在事務(wù)1更新前滿足事務(wù)2的更新條件,但數(shù)據(jù)行在事務(wù)1更新后又不滿足事務(wù)2的更新條件,事務(wù)2會被事務(wù)1阻塞么?
測試結(jié)果:會被阻塞
測試代碼:
DROP TABLE dbo.TB1GOCREATE TABLE TB1( C1 INT, C2 INT)GOCREATE UNIQUE CLUSTERED INDEX IDX_C1ON dbo.TB1( C1)GOINSERT INTO dbo.TB1( C1, C2 )SELECT 1,1UNIONSELECT 2,2UNIONSELECT 3,3UNIONSELECT 4,4GO事務(wù)1開始執(zhí)行,修改數(shù)據(jù)行但未提交;BEGIN TRANUPDATE dbo.TB1SET C1=11WHERE C1=1在新會話中事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=1View Code
3>事務(wù)1執(zhí)行 INSERT INTO dbo.TB1( C1, C2 )SELECT 5,5(此處假設(shè)C1為主鍵,使用行鎖),事務(wù)1未提交,而后事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=5,數(shù)據(jù)行在事務(wù)1更新前滿足事務(wù)2的更新條件,但數(shù)據(jù)行在事務(wù)1更新后又不滿足事務(wù)2的更新條件,事務(wù)2會被事務(wù)1阻塞么?
測試結(jié)果:會被阻塞
測試代碼:
DROP TABLE dbo.TB1GOCREATE TABLE TB1( C1 INT, C2 INT)GOCREATE UNIQUE CLUSTERED INDEX IDX_C1ON dbo.TB1( C1)GOINSERT INTO dbo.TB1( C1, C2 )SELECT 1,1UNIONSELECT 2,2UNIONSELECT 3,3UNIONSELECT 4,4GO事務(wù)1開始執(zhí)行,修改數(shù)據(jù)行但未提交;BEGIN TRANINSERT INTO dbo.TB1( C1, C2 )SELECT 5,5在新會話中事務(wù)2執(zhí)行UPDATE TB1 SET C2=2 WHERE C1=5View Code
測試結(jié)論:
對于未提交事務(wù)A修改的數(shù)據(jù),無論該數(shù)據(jù)在更新修改的值前還是修改后的值滿足事務(wù)B的修改條件,那么都會對事務(wù)B造成阻塞。
--==========================================================
年關(guān)近了,日子不好過,隨時擔(dān)心被母親大人電話轟炸,壓力山大,so,小伙伴們就將就著看著沒啥營養(yǎng)的博客吧!
--==========================================================
依舊是妹子
新聞熱點
疑難解答
圖片精選