请问,这个触发器、事务回滚
下面是触发器的一部分代码:
If(Select 库存数量 From Deleted)>0
Begin
Print ‘库存数量大于零时不能删除此记录’
Rollback Transaction
End
意思即是如果库存量不为0,就撤销删除操作。
我想问的是关于Rollback Transaction,在事务那一章节,书上说的-------“ROLLBACK只能在一个事务处理内使用(在执行一条BEGIN TRANSACTION 命令之后)。否则,如果前面没有BEGIN TRANSACTION 命令,ROLLBACK不会起作用。”
那此触发器中,并没有表示事务开始的BEGIN TRANSACTION 命令,那怎么能实现回滚呢?
[解决办法]
触发器自动位于触发触发器的那个事务,所以不必也不能在触发器写BEGIN TRANSACTION 命令
一般这段代码应该加return
If(Select 库存数量 From Deleted)>0Begin Print ‘库存数量大于零时不能删除此记录’ Rollback Transaction returnEnd
[解决办法]
--触发器内的事务是隐式的--应该保证多条记录不致有错,你那样只是一条记录if exists(select 1 from deleted where 库存数量>0)begin raiserror('库存数量大于零时不能删除此记录',11,1); rollback; return;end
[解决办法]
If(Select 库存数量 From Deleted)>0Begin Print ‘库存数量大于零时不能删除此记录’ Rollback Transaction ReturnEnd楼上都说完咯
[解决办法]
如果是隐式开启了事务,是可以不写begin tran来作为事务的开端。在开启了SET IMPLICIT_TRANSACTIONS 后,只需要显式回滚或撤销事务即可,不需要begin tran,相关详细信息可以看联机丛书
[解决办法]
IF (SELECT 库存数量 FROM deleted) > 0 BEGIN PRINT ‘库存数量大于零时不能删除此记录’ ROLLBACK TRANSACTION RETURN END--触发器内的事务是隐式的,隐式开启了事务,begin tran可以省略