2011-01-19 55 views
1

我需要將一些日誌數據保留在不同的表中,即使我的事務回滾了。在模擬自治事務的SQL Server 2005中

我已經瞭解到,在SQL Server中這是不可能做這樣的事情

begin tran t1 
insert ... 
insert ... 
select ... 
     begin tran t2 
     insert into log 
     commit tran t2 
rollback tran t1 
select * from log -- IS EMPTY ALWAYS 

所以我嘗試黑客 SQL服務器,我madded CLR這是要導出數據需要記錄到本地服務器硬盤以XML格式。 CLR代碼很簡單,因爲它可以:

File.WriteAllText(fileName, xmlLog.Value.ToString()); 

我發佈這個在生產基地生病喜歡聽到這種技術的惡棍之前。

這裏有幾個問題:

  • 是否有其他更好的辦法在SQL Server中實現自治事務2005
  • 怎麼能壞的握着我的事務的未提交而SQL Server正在執行CLR(寫入的數據量通過SQL是相對較小的約50 - 60紀錄的3個整數和4個浮點)
+0

您是否已閱讀此文章? http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx – 2011-01-19 16:30:35

回答

3

我會建議使用表變量,因爲它不受交易(這是指出,在博客中列出的方法之一由馬丁貝爾這個問題)。考慮這樣做,這將在SQL Server 2005工作:

DECLARE @TempLog TABLE (FieldList...) 

BEGIN TRY 

    BEGIN TRAN 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    INSERT... 

    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 

    IF (@@TRANCOUNT > 0) 
    BEGIN 
     ROLLBACK TRAN 
    END 

    /* Maybe add a Log message to note that we ran into an error */ 
    INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...) 

END CATCH 

INSERT INTO RealLogTable (FieldList...) 
    SELECT FieldsList 
    FROM @TempLog 

請注意,雖然我們正在使用的事實表變量不是交易的一部分,在這個代碼,它創建一個潛在的局面一個COMMIT,但在INSERT INTO RealLogTable之前出現錯誤(或服務器崩潰),並且您將失去對其進行登錄的數據的日誌記錄。此時會有斷開連接,因爲有數據但沒有記錄將其插入就RealLogTable而言。但這只是能夠繞過交易的明顯折衷。