解决阻塞事务 - SQL Server

时间:2017-11-30 07:08:51

标签: sql-server

我想了解为什么阻塞事务发生在以下用例中,以及解决它的最佳方法是什么。
我有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中的记录无关的记录。

0 个答案:

没有答案