Sql server SQL过程-开始事务并提交

Sql server SQL过程-开始事务并提交,sql-server,sql-server-2008,Sql Server,Sql Server 2008,嗨,我正在写一个程序pro_realocate_块, 我正在调用另一个程序pro_remove_分配。如果我为主程序pro_reallocate_块放入BEGIN TRANSACTION,如果主程序中出现任何错误,它将还原子程序pro_remove_分配 Create procedure pro_reallocate_block( @blockId int, @blockName nvarchar(max) ) WITH EXECUTE AS CALLER AS

嗨,我正在写一个程序pro_realocate_块, 我正在调用另一个程序pro_remove_分配。如果我为主程序pro_reallocate_块放入BEGIN TRANSACTION,如果主程序中出现任何错误,它将还原子程序pro_remove_分配

Create procedure pro_reallocate_block(
@blockId int,
@blockName nvarchar(max)
)    
WITH EXECUTE AS CALLER      
AS      
Begin           

 SET XACT_ABORT, NOCOUNT ON;        
 BEGIN TRY          
 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE        
 BEGIN TRANSACTION        

Declare @AllocatedBlockid int

 exec pro_remove_allocation @blockId 
 if((select COUNT(blockId) from blocks where blockId=@blockId)>0)
    select * from blocks where blockId=@blockId 
    else 
        select * from blocks where bdefault=1
 COMMIT TRANSACTION        
 SET TRANSACTION ISOLATION LEVEL READ COMMITTED        
 END TRY        

 BEGIN CATCH        
  IF XACT_STATE() <> 0        
  BEGIN        
   ROLLBACK TRANSACTION        

   DECLARE @ErrorMessage NVARCHAR(4000);        
   DECLARE @ErrorSeverity INT;        
   DECLARE @ErrorState INT;        

   SELECT @ErrorMessage = ERROR_MESSAGE(),        
       @ErrorSeverity = ERROR_SEVERITY(),        
       @ErrorState = ERROR_STATE();        

   RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);        
  END        
 END CATCH    
end

应该可以了,好吧。也许最好的办法是编写一些测试过程并引发一个错误,以查看回滚是否有效。那你就知道了。当你只想检查是否存在时,请不要计算。这就是存在的目的。如果你幸运的话,优化器会发现你的意图并将其转换为等价的存在形式,但是为什么要强迫它做更多的工作呢?达米恩·努非信徒感谢你的建议。。。交易是怎么发生的!