2015-12-31 2 views
2

Это хороший способ добавить TRANSACTION в мой код. Я должен сначала обновить свой код, и если он не сработает, вставка также не будет работать. Посмотрите, пожалуйста, если это правильный способ или нет. Если нет, то пожалуйста, улучшитесь.Это хороший способ добавить транзакцию в sql?

Begin Transaction[Transaction1] 

    Begin Try 

     IF(@ServiceInfoToJobStatus = 1) 
      Update ServiceInfo 
      Set ServiceInfoToJobStatus= 0 --To set all current jobs to prior because one person cannot have many jobs selected as current 
      Where @ServiceInfoToJobStatus = 1 AND ServiceInfo.fk_PersonalInfo_ServiceInfo_PID= @fk_PersonalInfo_ServiceInfo_PID 

      Set @ServiceInfoEntryDateTime= (Select GetDate()) 

       Insert into dbo.ServiceInfo 
       (

       ServiceInfoInitialDesignation, 
       ServiceInfoInitialBPS, 
       fk_Districts_ServiceInfo_InitialDistrictID, 
       ServiceInfoJobStatus, 
       ServiceInfoFromDate, 
       ServiceInfoDepartment, 
       fk_PersonalInfo_ServiceInfo_PID, 
       ServiceInfoServiceType , 
       ServiceInfoOffice , 
       ServiceInfoCadre , 
       fk_WebUsers_ServiceInfo_UserID, 
       ServiceInfoEntryDateTime, 
       ServiceInfoToDesignation  , 
       ServiceInfoToBPS  , 
       fk_Districts_ServiceInfo_ToDistrictID  , 
       ServiceInfoToJobStatus  , 
       ServiceInfoToDate  , 
       ServiceInfoToDepartment  , 
       ServiceInfoToServiceType  , 
       ServiceInfoToOffice  , 
       ServiceInfoToCadre  
      ) 

       Values 
       (

       @ServiceInfoInitialDesignation, 
       @ServiceInfoInitialBPS, 
       @fk_Districts_ServiceInfo_InitialDistrictID, 
       @ServiceInfoJobStatus, 
       @ServiceInfoFromDate, 
       @ServiceInfoDepartment, 
       @fk_PersonalInfo_ServiceInfo_PID, 
       @ServiceInfoServiceType , 
       @ServiceInfoOffice , 
       @ServiceInfoCadre , 
       @fk_WebUsers_ServiceInfo_UserID, 
       Convert(varchar, @ServiceInfoEntryDateTime, 113), 
       @ServiceInfoToDesignation  , 
       @ServiceInfoToBPS  , 
       @fk_Districts_ServiceInfo_ToDistrictID  , 
       @ServiceInfoToJobStatus  , 
       @ServiceInfoToDate  , 
       @ServiceInfoToDepartment  , 
       @ServiceInfoToServiceType  , 
       @ServiceInfoToOffice  , 
       @ServiceInfoToCadre  
      ) 

       Set @ReturnStatus = 1 


    Commit Transaction[Transaction1] 

    End Try 

    Begin Catch 

       ROLLBACK Transaction[Transaction1] 

       Set @ReturnStatus= 0 
       Set @ReturnStatusMessage= (Select ERROR_MESSAGE())    

    End Catch 

ответ

0

Рекомендуется использовать дополнительные transaction (try/catch block) если код updates или inserts данные в таблице. В вашем случае ответ довольно да. Но в вашем блоке транзакций нет способа узнать, завершены ли данные insert/update.

Я использовал бы следующий синтаксис с @@error.

BEGIN TRY 
     BEGIN TRAN 

     //YOUR CODE 

     IF @@ERROR = 0 
      BEGIN 
       COMMIT TRAN; 
      END 
END TRY 
BEGIN CATCH 
     SELECT @@ERROR AS ERROR 
ROLLBACK TRAN; 
END CATCH  
0

Для меня непонятно, что update fails средства (ошибка или нет обновленных строк), но это не имеет большого значения, так как вы можете проверить оба довольно легко:

DECLARE @UpdateErrorNo INT 
DECLARE @UpdateCount INT 
DECLARE @InsertErrorNo INT 

Begin Transaction[Transaction1] 
Begin Try 
    IF(@ServiceInfoToJobStatus = 1) 
     Update ServiceInfo 
     Set ServiceInfoToJobStatus= 0 --To set all current jobs to prior because one person cannot have many jobs selected as current 
     Where @ServiceInfoToJobStatus = 1 AND ServiceInfo.fk_PersonalInfo_ServiceInfo_PID= @fk_PersonalInfo_ServiceInfo_PID 

    SET @UpdateErrorNo = @@ERROR 
    SET @UpdateCount = @@ROWCOUNT 

    Set @ServiceInfoEntryDateTime= (Select GetDate()) 

    Insert into dbo.ServiceInfo 
    (
     -- skipped for readability 
    ) 

    Values 
    (
     -- skipped for readability 
    ) 

    SET @InsertErrorNo = @@ERROR 

    Set @ReturnStatus = 1 

Commit Transaction[Transaction1] 

End Try 

Begin Catch 

    ROLLBACK Transaction[Transaction1] 

    Set @ReturnStatus= 0 
    Set @ReturnStatusMessage= (Select ERROR_MESSAGE())    

End Catch 

-- here you can read `@UpdateErrorNo`, `@InsertErrorNo` to check for errors 

Хитрая часть что @@ ERROR устанавливается после каждого оператора, поэтому если у вас есть такой случай (не попробовать/поймать):

BEGIN TRAN 
INSERT ... -- fails 
UPDATE ... -- success 

-- @@ERROR will not show that it is a failure 
COMMIT 

это может привести к неожиданным результатам.

0

объявить @cdt DateTime = GETDATE() начинают попробовать начать транзакцию

Update dbo.ServiceInfo 
Set ServiceInfoToJobStatus= 0 --To set all current jobs to prior because one person cannot have many jobs selected as current 
Where @ServiceInfoToJobStatus = 1 
     AND fk_PersonalInfo_ServiceInfo_PID= @fk_PersonalInfo_ServiceInfo_PID 

      Insert into dbo.ServiceInfo 
      (

      ServiceInfoInitialDesignation, 
      ServiceInfoInitialBPS, 
      fk_Districts_ServiceInfo_InitialDistrictID, 
      ServiceInfoJobStatus, 
      ServiceInfoFromDate, 
      ServiceInfoDepartment, 
      fk_PersonalInfo_ServiceInfo_PID, 
      ServiceInfoServiceType , 
      ServiceInfoOffice , 
      ServiceInfoCadre , 
      fk_WebUsers_ServiceInfo_UserID, 
      ServiceInfoEntryDateTime, 
      ServiceInfoToDesignation  , 
      ServiceInfoToBPS  , 
      fk_Districts_ServiceInfo_ToDistrictID  , 
      ServiceInfoToJobStatus  , 
      ServiceInfoToDate  , 
      ServiceInfoToDepartment  , 
      ServiceInfoToServiceType  , 
      ServiceInfoToOffice  , 
      ServiceInfoToCadre  
     ) 

      Values 
      (

      @ServiceInfoInitialDesignation, 
      @ServiceInfoInitialBPS, 
      @fk_Districts_ServiceInfo_InitialDistrictID, 
      @ServiceInfoJobStatus, 
      @ServiceInfoFromDate, 
      @ServiceInfoDepartment, 
      @fk_PersonalInfo_ServiceInfo_PID, 
      @ServiceInfoServiceType , 
      @ServiceInfoOffice , 
      @ServiceInfoCadre , 
      @fk_WebUsers_ServiceInfo_UserID, 
      Convert(varchar, @cdt, 113), 
      @ServiceInfoToDesignation  , 
      @ServiceInfoToBPS  , 
      @fk_Districts_ServiceInfo_ToDistrictID  , 
      @ServiceInfoToJobStatus  , 
      @ServiceInfoToDate  , 
      @ServiceInfoToDepartment  , 
      @ServiceInfoToServiceType  , 
      @ServiceInfoToOffice  , 
      @ServiceInfoToCadre  
     ) 

      return ... 

commit transaction 

End Try начать добычу , если (@@ TRANCOUNT> 0) отката транзакции

return ... 

конец улов

0

Это то, что я использую:

Begin Try 
    Begin Tran 

    -- Do your thing... some DML statements 

    Commit Tran 
End Try 

Begin Catch 
    If (@@TranCount > 0) 
     Rollback Tran 
End Catch 
Смежные вопросы