日期:2014-05-17  浏览次数:20702 次

请问,这个触发器、事务回滚
下面是触发器的一部分代码:

If(Select 库存数量 From Deleted)>0
Begin
  Print ‘库存数量大于零时不能删除此记录’
  Rollback Transaction
End


意思即是如果库存量不为0,就撤销删除操作。

我想问的是关于Rollback Transaction,在事务那一章节,书上说的-------“ROLLBACK只能在一个事务处理内使用(在执行一条BEGIN TRANSACTION 命令之后)。否则,如果前面没有BEGIN TRANSACTION 命令,ROLLBACK不会起作用。”

那此触发器中,并没有表示事务开始的BEGIN TRANSACTION 命令,那怎么能实现回滚呢?

------解决方案--------------------
触发器自动位于触发触发器的那个事务,所以不必也不能在触发器写BEGIN TRANSACTION 命令
一般这段代码应该加return

SQL code
If(Select 库存数量 From Deleted)>0
Begin
  Print ‘库存数量大于零时不能删除此记录’
  Rollback Transaction
 return
End

------解决方案--------------------
SQL code

--触发器内的事务是隐式的
--应该保证多条记录不致有错,你那样只是一条记录
if exists(select 1 from deleted where 库存数量>0)
begin
    raiserror('库存数量大于零时不能删除此记录',11,1);
    rollback;
    return;
end

------解决方案--------------------
SQL code

If(Select 库存数量 From Deleted)>0
Begin
  Print ‘库存数量大于零时不能删除此记录’
  Rollback Transaction
  Return
End

楼上都说完咯

------解决方案--------------------
如果是隐式开启了事务,是可以不写begin tran来作为事务的开端。在开启了SET IMPLICIT_TRANSACTIONS 后,只需要显式回滚或撤销事务即可,不需要begin tran,相关详细信息可以看联机丛书
------解决方案--------------------
SQL code

IF (SELECT 库存数量
    FROM   deleted) > 0
  BEGIN
    PRINT ‘库存数量大于零时不能删除此记录’
    ROLLBACK TRANSACTION
    RETURN
  END
--触发器内的事务是隐式的,隐式开启了事务,begin tran可以省略