测试事务提交
USE TestDB GO --数据结构 CREATE TABLE TUser ( FID INT IDENTITY(1,1) PRIMARY KEY, FCompanyID INT NOT NULL, FName VARCHAR(30) NOT NULL, FAddTime DATETIME DEFAULT(GETDATE()), FSessionID INT DEFAULT(@@SPID) ) GO
--会话窗口54 INSERT INTO TUser(FCompanyID,FName) VALUES (101,'test101') INSERT INTO TUser(FCompanyID,FName) VALUES (NULL,'test102') --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (103,NULL) --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (104,'test104') GO SELECT * FROM TUser GO
(1 行受影响) 消息 515,级别 16,状态 2,第 4 行 不能将值 NULL 插入列 'FCompanyID',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 语句已终止。 消息 515,级别 16,状态 2,第 5 行 不能将值 NULL 插入列 'FName',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 语句已终止。 (1 行受影响) (2 行受影响)

只回滚错误行,语句还继续执行。
--会话窗口55 TRUNCATE TABLE TUser GO BEGIN TRAN INSERT INTO TUser(FCompanyID,FName) VALUES (101,'test101') INSERT INTO TUser(FCompanyID,FName) VALUES (NULL,'test102') --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (103,NULL) --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (104,'test104') COMMIT TRAN GO SELECT * FROM TUser GO
(1 行受影响) 消息 515,级别 16,状态 2,第 8 行 不能将值 NULL 插入列 'FCompanyID',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 语句已终止。 消息 515,级别 16,状态 2,第 9 行 不能将值 NULL 插入列 'FName',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 语句已终止。 (1 行受影响) (2 行受影响)

事务终止并全部回滚。
--会话窗口56 TRUNCATE TABLE TUser GO BEGIN TRY BEGIN TRAN INSERT INTO TUser(FCompanyID,FName) VALUES (101,'test101') INSERT INTO TUser(FCompanyID,FName) VALUES (NULL,'test102') --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (103,NULL) --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (104,'test104') COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN PRINT N'异常,回滚操作--' + ERROR_MESSAGE() END CATCH GO SELECT * FROM TUser GO
(1 行受影响) (0 行受影响) 异常,回滚操作--不能将值 NULL 插入列 'FCompanyID',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 (0 行受影响)

每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚。
事务在错误行终止,错误行回滚,错误之前的不会滚。
--会话窗口57 TRUNCATE TABLE TUser GO SET XACT_ABORT ON INSERT INTO TUser(FCompanyID,FName) VALUES (101,'test101') INSERT INTO TUser(FCompanyID,FName) VALUES (NULL,'test102') --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (103,NULL) --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (104,'test104') GO SELECT * FROM TUser GO
(1 行受影响) 消息 515,级别 16,状态 2,第 9 行 不能将值 NULL 插入列 'FCompanyID',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 (1 行受影响)

总体作为一个事务,整体提交或整体回滚。
事务终止并全部回滚。
--会话窗口58 TRUNCATE TABLE TUser GO SET XACT_ABORT ON BEGIN TRAN INSERT INTO TUser(FCompanyID,FName) VALUES (101,'test101') INSERT INTO TUser(FCompanyID,FName) VALUES (NULL,'test102') --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (103,NULL) --ERROR INSERT INTO TUser(FCompanyID,FName) VALUES (104,'test104') COMMIT TRAN GO SELECT * FROM TUser GO
(1 行受影响) 消息 515,级别 16,状态 2,第 9 行 不能将值 NULL 插入列 'FCompanyID',表 'TestDB.dbo.TUser';列不允许有 Null 值。INSERT 失败。 (0 行受影响)


浙公网安备 33010602011771号