显式事务
显式事务(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 系统在所有提交、还原之后,自动创建新事务。