1 --==============================事务===============================
2 --简单的事务
3 --Messages:1 2 4 6
4 print 1
5 --事务开始
6 BEGIN TRAN
7
8 --插入一条数据
9 INSERT INTO 类别(类别名称)
10 VALUES ('bbb')
11 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1) --@@ERROR = 0代表正常,否则出错
12 GOTO TranRollBack
13
14 print 2
15
16 --插入一条数据
17 --已经有了aaa,会出错!
18 INSERT INTO 类别(类别名称)
19 VALUES ('aaa')
20 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1)
21 GOTO TranRollBack
22
23 PRINT 3
24
25 --插入一条数据
26 INSERT INTO 类别(类别名称)
27 VALUES ('ccc')
28
29 IF(@@ERROR > 0)
30 BEGIN
31 TranRollBack:
32 PRINT 4
33 --回滚事务
34 ROLLBACK TRAN
35 END
36 ELSE
37 BEGIN
38 PRINT 5
39 --提交事务
40 COMMIT TRAN
41 END
42
43 print 6
44
45 --嵌套事务
46 --由于事务的原子性,事务内的所有语句要么全部执行,要么全部不执行,所以内层的COMMIT是没有意义的,仅仅是内层事务结束的标志
47 --内层事务若触发ROLLBACK,会回滚到外层事务之前的状态,而不是内层事务开始时的状态!
48 --82 rows
49 SELECT COUNT(1) FROM 产品
50 --开始事务
51 BEGIN TRAN
52 --插入一条数据
53 INSERT INTO 产品(产品名称,类别ID) VALUES('西瓜汁',1)
54 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1)
55 GOTO TranRollback
56 --83 rows
57 SELECT COUNT(1) FROM 产品
58 --嵌套事务
59 BEGIN TRAN
60 --插入一条数据,会出错!
61 INSERT INTO 产品(产品ID) VALUES(1)
62 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1)
63 BEGIN
64 ROLLBACK TRAN
65 END
66 ELSE
67 BEGIN
68 COMMIT TRAN
69 END
70 --82 rows
71 SELECT COUNT(1) FROM 产品
72 --再插入一条数据
73 INSERT INTO 产品(产品名称,类别ID) VALUES('可乐',1)
74 --83 rows
75 SELECT COUNT(1) FROM 产品
76 IF @@ERROR > 0
77 BEGIN
78 TranRollback:
79 ROLLBACK TRAN
80 END
81 ELSE
82 BEGIN
83 COMMIT TRAN
84 END
85 --83 rows
86 SELECT COUNT(1) FROM 产品
87
88 --事务保存点
89 --使用事务保存点,可以在内层事务回滚时只回滚到该内层事务的开始状态,从而可以实现有选择的回滚一部分
90 --82 rows
91 SELECT COUNT(1) FROM 产品
92 --开始事务
93 BEGIN TRAN
94 --插入一条数据
95 INSERT INTO 产品(产品名称,类别ID) VALUES('西瓜汁',1)
96 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1)
97 GOTO TranRollback
98 --83 rows
99 SELECT COUNT(1) FROM 产品
100 --嵌套事务
101 --保存事务位置
102 SAVE TRAN 嵌套事务
103 BEGIN TRAN
104 --插入一条数据,会出错!
105 INSERT INTO 产品(产品ID) VALUES(1)
106 IF(@@ERROR > 0 OR @@ROWCOUNT <> 1)
107 BEGIN
108 ROLLBACK TRAN 嵌套事务 --此时要加上事务保存点的名称
109 END
110 ELSE
111 BEGIN
112 COMMIT TRAN 嵌套事务 --此时要加上事务保存点的名称
113 END
114 --83 rows
115 SELECT COUNT(1) FROM 产品
116 --再插入一条数据
117 INSERT INTO 产品(产品名称,类别ID) VALUES('可乐',1)
118 --84 rows
119 SELECT COUNT(1) FROM 产品
120 IF @@ERROR > 0
121 BEGIN
122 TranRollback:
123 ROLLBACK TRAN
124 END
125 ELSE
126 BEGIN
127 COMMIT TRAN
128 END
129 --84 rows
130 SELECT COUNT(1) FROM 产品