--概要:SqlService常用语句[事务]
--设计者:DuanXuWen
--版本:0.1
--修改者:
--修改时间:
--Begin Transaction:标记事务开始。
--Commit Transaction:事务已经成功执行,数据已经处理妥当。
--Rollback Transaction:数据处理过程中出错,回滚到没有处理之前的数据状态,或回滚到事务内部的保存点。
--Save Transaction:事务内部设置的保存点,就是事务可以不全部回滚,只回滚到这里,保证事务内部不出错的前提下。
--xact_abort on/off , 指定是否回滚当前事务,为on时如果当前sql出错,回滚整个事务,为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库。
--需要注意的时:xact_abort只对运行时出现的错误有用,如果sql语句存在编译时错误,那么他就失灵啦。
CREATE TABLE #table1
(
Id INT IDENTITY(1,1), --主键自增
Name VARCHAR(20),--名字
Age INT --年龄
)
--①事务---------------------------------------------
--开启事务
BEGIN TRAN
--错误机制
BEGIN TRY
INSERT INTO #table1 VALUES('哈哈',16)
INSERT INTO #table1 VALUES('嘻嘻','出错')
INSERT INTO #table1 VALUES('呵呵',18)
END TRY
BEGIN CATCH
SELECT
Error_number() AS ErrorNumber, --错误代码
Error_severity() AS ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到
Error_state() AS ErrorState , --错误状态码
Error_Procedure() AS ErrorProcedure , --出现错误的存储过程或触发器的名称。
Error_line() AS ErrorLine, --发生错误的行号
Error_message() AS ErrorMessage --错误的具体信息
IF(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
BEGIN
ROLLBACK TRAN ---由于出错,这里回滚到开始,第一条语句也没有插入成功。
END
END CATCH
IF(@@trancount>0)
BEGIN
COMMIT TRAN --如果成功#table1表中,将会有3条数据。
END
SELECT * FROM #table1
--②事务[保存点]---------------------------------------------
--开启事务
BEGIN TRAN
--错误机制
BEGIN TRY
INSERT INTO #table1 VALUES('哈哈',16)
--保存点
SAVE TRAN onesucceeds
INSERT INTO #table1 VALUES('嘻嘻',17)
INSERT INTO #table1 VALUES('呵呵',18)
END TRY
BEGIN CATCH
SELECT
Error_number() AS ErrorNumber, --错误代码
Error_severity() AS ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到
Error_state() AS ErrorState , --错误状态码
Error_Procedure() AS ErrorProcedure , --出现错误的存储过程或触发器的名称。
Error_line() AS ErrorLine, --发生错误的行号
Error_message() AS ErrorMessage --错误的具体信息
IF(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
BEGIN
ROLLBACK TRAN ---由于出错,这里回滚到开始,第一条语句也没有插入成功。
END
END CATCH
IF(@@trancount>0)
BEGIN
ROLLBACK TRAN onesucceeds--#table1表中,将会有1条数据。
END
SELECT * FROM #table1
--③事务[指定是否回滚当前事务]---------------------------------------------
set xact_abort OFF
--开启事务
BEGIN TRAN
INSERT INTO #table1 VALUES('哈哈',16)
INSERT INTO #table1 VALUES('嘻嘻',12345646879783213)
INSERT INTO #table1 VALUES('呵呵',18)
--提交事务
COMMIT TRAN
SELECT * FROM #table1