2011-03-08 23 views
0

我想使用沒有嘗試捕獲的事務。但我不知道分配回滾。以下聲明總是提交。請幫幫我。 @@錯誤可以捕獲一個錯誤。所以,我不想用這個。使用沒有嘗試捕獲的事務

BEGIN TRANSACTION 

    INSERT Person values (@name,@age); 
    INSERT User values (@name,@age); 

IF @@TRANCOUNT>0 
    COMMIT TRANSACTION 
ELSE 
    ROLLBACK TRANSACTION 
+0

你對這個@zahntet仍然感到困惑,或者你最終弄清楚爲什麼@@ trancount總是在零以上的事實? – jcolebrand 2011-06-03 18:56:02

回答

0

隨時你BEGIN TRANSACTION然後@@TRANCOUNT增加。

所以,因爲你沒有一次增加它,那麼它將永遠>0

你大概的意思來檢查IF (@@ERROR > 0) ROLLBACK TRAN

而且,我會鼓勵你,讓你知道你使用的命名事務回滾正確的交易(如果沒有其他原因可追溯)

+0

zanhtet不想使用@@錯誤-1與偏見! – 2011-03-08 03:43:15

-1
BEGIN TRANSACTION 

    INSERT Person values (@name,@age); 
    INSERT User values (@name,@age); 

IF @@ERROR == 0 
    COMMIT TRANSACTION 
ELSE 
    ROLLBACK TRANSACTION 
0

@@錯誤只捕獲最後一個語句錯誤代碼,但如果您檢查後每個插入語句 - 我認爲你會達到預期的行爲。

BEGIN TRANSACTION 

INSERT Person values (@name,@age); 

IF (@@ERROR <> 0) BEGIN 
    PRINT 'Unexpected error occurred!' 
    ROLLBACK TRAN 
    RETURN 1 
END 

INSERT User values (@name,@age); 

IF (@@ERROR <> 0) BEGIN 
    PRINT 'Unexpected error occurred!' 
    ROLLBACK TRAN 
    RETURN 1 
END 

COMMIT TRANSACTION 
+0

如果陳述有很多,那麼檢查每個陳述。 – zanhtet 2011-03-08 03:46:14

+0

如果你有很多交易 - 你可以使用GOTO來減少你需要複製/粘貼的代碼量 – Sergey 2011-03-08 03:48:34

+1

通過同樣的邏輯,我們可以使用遊標和臨時表...... – jcolebrand 2011-03-08 03:50:12