0

こんにちは、その中に「pro_reallocate_block」プロシージャを書いています。別のプロシージャ「pro_remove_allocation」を呼び出しています。メイン プロシージャ「pro_reallocate_block」に BEGIN TRANSACTION を配置すると、メイン プロシージャでエラーが発生した場合に、サブ プロシージャ「pro_remove_allocation」が元に戻ります。

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
4

0 に答える 0