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 產品