Sql Server 三种事务模式
显式事务
显式事务(Explicit Transaction)是由设计人员明确定义事务的启动与结束的一种事务。
可使用 BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION、ROLLBACK WORK 等语句来定义显式事务。
Create PROCEDURE sp_test(@ID varchar(50))
AS
Begin Tran --事务开始
Update Tb set CDate=getdate() where TbID=@ID
if @@ERROR >0 --若有错误
BEGIN
ROLLBACK TRAN --事务还原
Return
End
DECLARE @PID varchar(50),@TbQty int
DECLARE cur_1 CURSOR FOR SELECT PID, Qty FROM TbDetail where TbID=@ID --声明游标数据事务
OPEN cur_1 --打开游标
FETCH NEXT FROM cur_1 INTO @PID,@TbQty --从游标获取两个字段值到变量
WHILE @@FETCH_STATUS = 0 --用循环逐项处理
BEGIN
Update Ta set TaQty=TaQty-@TbQty where PID=@PID
FETCH NEXT FROM cur_1 INTO @PID,@TbQty
if @@ERROR >0 –若有错误
Begin
ROLLBACK TRAN --事务还原
CLOSE cur_1 --关闭及释放游标
DEALLOCATE cur_1
BREAK
END
END
CLOSE cur_1
DEALLOCATE cur_1
COMMIT TRAN --事务提交
AS
Begin Tran --事务开始
Update Tb set CDate=getdate() where TbID=@ID
if @@ERROR >0 --若有错误
BEGIN
ROLLBACK TRAN --事务还原
Return
End
DECLARE @PID varchar(50),@TbQty int
DECLARE cur_1 CURSOR FOR SELECT PID, Qty FROM TbDetail where TbID=@ID --声明游标数据事务
OPEN cur_1 --打开游标
FETCH NEXT FROM cur_1 INTO @PID,@TbQty --从游标获取两个字段值到变量
WHILE @@FETCH_STATUS = 0 --用循环逐项处理
BEGIN
Update Ta set TaQty=TaQty-@TbQty where PID=@PID
FETCH NEXT FROM cur_1 INTO @PID,@TbQty
if @@ERROR >0 –若有错误
Begin
ROLLBACK TRAN --事务还原
CLOSE cur_1 --关闭及释放游标
DEALLOCATE cur_1
BREAK
END
END
CLOSE cur_1
DEALLOCATE cur_1
COMMIT TRAN --事务提交
自动提交事务
这是 SQL Server 的默认模式,所有未特别声明的事务,都被视为自动提交的事务。但
是只以一个操作作为事务范围,如一个 Update 或 Delete 等。当事务完成时,每个单独的
T-SQL 语句都将被提交或因出现错误而还原。
隐式事务
通过 API 函数或 T-SQL 的 SET IMPLICIT_TRANSACTIONS ON 语句将隐式事务模式
设置为打开。下一个语句会自动开始一项新的事务。当该项事务完成时,下一个 T-SQL 语
句会再开始一项新的事务。
SET IMPLICIT_TRANSACTIONS ON
INSERT INTO Ta (aa,bb) VALUES ('11', '22')
COMMIT TRANSACTION
GO
INSERT INTO Ta (aa,bb) VALUES ('11', '22')
COMMIT TRANSACTION
GO
以上程序表示先使用“SET IMPLICIT_TRANSACTIONS ON”启动隐式事务,然后在
下一行程序创建事务,以 Insert 语句添加一项记录至 Category 数据表,最后再用 COMMIT
TRANSACTION 提交事务。提交之后若还有程序,会再开始新的事务。总之,隐式事务的
意思是由 SQL Server 系统在所有提交、还原之后,自动创建新事务。