[MSSQL] SQL Server 的一些眉眉角角 part.2

小知識

  1. 交易中資料表會持續鎖定至交易結束或是連線結束
  2. 最外層的交易 ROLLBACK,內層就算 COMMIT 依然會復原變更
  3. 巢狀交易過程中的資料表都會鎖定直到交易結束,外層交易 COMMIT 內層交易卻沒有 COMMIT 資料表會被鎖定不會釋放
  4. 交易前加上 SET XACT_ABORT ON 可防止過程中發生錯誤沒有 ROLLBACK 造成鎖表的問題

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
-- SET XACT_ABORT ON
-- SELECT * FROM ##TableA
-- DROP TABLE ##TableA
CREATE TABLE ##TableA
(
Id INT,
CName NVARCHAR(32)
)

INSERT INTO ##TableA
(
Id,
CName
)
VALUES
(
1,
'aaaaa'
),
(
2,
'bbbbb'
)

BEGIN TRAN Test1

UPDATE
##TableA
SET
CName = 'ccccc'
WHERE
Id = 1

BEGIN TRAN Test2

UPDATE
##TableA
SET
CName = 'dddddd'
WHERE
Id = 2

-- COMMIT TRAN Test2
-- ROLLBACK TRAN Test2

-- COMMIT TRAN Test1
-- ROLLBACK TRAN Test1