declare @x int
set @x = 1
declare @j int
set @j = 10
begin transaction
  set @j = 100
   if @x<>0
     begin
       rollback transaction
       set @x = 2
     end
    else
       commit transaction
print @j
print @x这里的  if条件 明明成立的但为什么 回滚操作好像没效果print @j 和 print @x 打印出来的仍旧是 100 和 2 为什么?

解决方案 »

  1.   

    CREATE TABLE #x (x INT)
    CREATE TABLE #j (j INT)INSERT #x SELECT 1
    INSERT #j SELECT 10
    BEGIN TRANSACTION
    UPDATE #j SET j = 100
    IF 1=1
    BEGIN
    ROLLBACK TRANSACTION
    UPDATE #x SET x = 2
    END
    ELSE 
    COMMIT TRANSACTIONSELECT * FROM #x
    /*
    x
    -----------
    2(1 行受影响)
    */
    SELECT * FROM #j
    /*
    j
    -----------
    10(1 行受影响)
    */DROP TABLE #x,#j变量好像不能回滚
      

  2.   

    print @j 和 print @x 打印出来的仍旧是 100 和 2  
    @j,@x这个两个是变量,并非数据库的数据
      

  3.   

    事务回滚是针对数据库的更新操作的,变量变量只是事务运行过程中的一个中间媒体或过度,它不会受事务的控制,对变量的操作仍旧有效。
    另外,楼主给出的,set @i=2这个语句本身也不再事务回滚的范围内。呵呵
      

  4.   

    set @i=2不在回滚的范围内,事务回滚后继续向下执行,并给@i赋值了啊