我想了解为什么阻塞事务发生在以下用例中,以及解决它的最佳方法是什么。
我有3张桌子,如下所述。
CREATE TABLE Test_PJ (pno INT PRIMARY KEY, pname VARCHAR(20));
CREATE TABLE Test_US (sno INT PRIMARY KEY, sname1 VARCHAR(20),
sname2 VARCHAR(20), sname3 VARCHAR(20));
CREATE TABLE Test_PS (pno INT FOREIGN KEY REFERENCES Test_Pj (pno),
sno INT FOREIGN KEY REFERENCES Test_US (sno)
ON DELETE CASCADE, psname VARCHAR(20),
PRIMARY KEY(pno, sno));
INSERT INTO Test_Pj VALUES(1,'PJ1');
INSERT INTO Test_Pj VALUES(2,'PJ2');
INSERT INTO Test_US VALUES(10,'US11','US12','US13');
INSERT INTO Test_US VALUES(20,'US21','US22','US23');
我试图在以下组合中运行以下事务,最终导致阻塞事务。
组合:
1.在另一个运行T2a中打开会话T1上的两个数据库会话( T2a获取
阻塞)
2.在另一次运行中在会话T1上打开两个数据库会话
T2b( T2b被阻止)
/*-------------
Transaction - T1: START
-------------*/
BEGIN TRAN
INSERT INTO Test_PS VALUES(1,10,'PSx');
/*-------------
Transaction - T1: PAUSE
-------------*/
/*-------------
Transaction - T2a: START
-------------*/
BEGIN TRAN
DELETE FROM test_us WHERE sname1 = 'US21';
/*-------------
Transaction - T2a: PAUSE
-------------*/
/*-------------
Transaction - T2b: START
-------------*/
BEGIN TRAN
DELETE ps FROM Test_PS ps INNER JOIN Test_US us
ON us.sno = ps.sno
WHERE sname1 = 'US21';
/*-------------
Transaction - T2b: PAUSE
-------------*/
这里是T2a和T2b,并尝试删除与插入T1中的记录无关的记录。