home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.databases.ms-sqlserver      Notorious Rube Goldberg contraption      19,505 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 18,327 of 19,505   
   Gene Wirchenko to esquel@sommarskog.se   
   Re: SSE 2008: Transactions and Rollbacks   
   18 May 11 10:50:55   
   
   XPost: microsoft.public.sqlserver.programming   
   From: genew@ocis.net   
      
   On Wed, 18 May 2011 07:27:20 +0000 (UTC), Erland Sommarskog   
    wrote:   
      
        Let me see if I follow.   
      
   >Gene Wirchenko (genew@ocis.net) writes:   
   >>      The insert trigger fires.  At the first statement of the insert   
   >> trigger's try block, @@trancount=1.  Why 1?   
   >   
   >When you are in a trigger, you are always in a transaction. If you did not   
   >start one explicitly, there is still an implicit one defined by the   
   >statement that fired the trigger. This is an essential point: the trigger is   
   >part of the INSERT statemnet, and if the trigger fails, the INSERT statement   
   >should also be rolled back.   
      
        Had I not been checking trigger code, there would not have been   
   an implicit transaction created, and it would have been correct (and a   
   good idea) to have a BEGIN TRANSACTION.  Since the code in question is   
   a trigger, there is no need for a BEGIN TRANSACTION, but it does not   
   hurt.   
      
       Correct?   
      
   >>      Supposedly, set xact_error on causes auto-rollbacks.  Fine, but   
   >> the above happens with set xact_error off (unless I am actually not   
   >> setting it in the right place.)   
   >   
   >When you are in a trigger XACT_ABORT is ON by default. Furthermore, if you   
   >roll back the transaction in the trigger, the batch is aborted.   
      
        In the trigger, because a raiserror() caused the catch block to   
   be executed, a rollback will automatically occur.   
      
        Correct?   
      
        Were it not trigger code, then the setting of SET XACT_ABORT   
   would matter.   
      
        Correct?   
      
        Does the setting for SET XACT_ABORT get restored when a trigger   
   finishes execution?  How does this work when there are other   
   procedures called?  Same question, but is it any different if the   
   lower-level procedure raises an error (as does your error handler)?   
      
   >Error handling in SQL Server is a patchwork of inconsistencies. A lot   
      
        Eä Cthulhu!   
      
   >inherited from Sybase, but Microsoft has been careful to add their own   
   >madness. Up to SQL 2000, an error in a trigger always aborted the batch, but   
   >starting with SQL 2005 you can prevent that with an explicit SET XACT_ABORT   
   >OFF in the trigger.   
      
        Nothing that I have read has mentioned when to set SET   
   XACT_ABORT.  Is any time before an error occurs acceptable?  From your   
   last paragraph, the answer to this appears to be yes.   
      
        Correct?   
      
   Sincerely,   
      
   Gene Wirchenko   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca