2

我們有一個DAL需要在可以回滾或提交的單個事務中包裝許多數據庫插入。管理跨多個事務的SQL數據庫連接

處理這個問題的最佳做法是什麼?

目前,我們正在做以下幾點:

  1. 創建數據庫連接和事務
  2. 填寫的集合與所有代表執行操作的類。通過構造函數傳入連接。
  3. 在try/catch中,循環遍歷所有動作類並調用他們的Publish()方法
  4. 如果成功(關閉連接)則提交,如果錯誤(關閉連接)則回滾。

這個過程可能需要一段時間,我們似乎用盡了池中的數據庫連接。有沒有更好的方式來管理交易?

這是使用SQL 2008,.net 3.5和4.1版本的企業庫數據訪問。

+0

爲什麼說當您只使用一個連接在所有類上進行插入時,您的池連接用完了? – msvcyc 2009-07-31 14:28:26

回答

2

要麼是輸入錯誤,要麼是因爲您將SqlConnection傳遞給Publish方法(而不是傳遞SqlTransaction)。

SqlTransaction有一個連接屬性,所有更新應該使用。

所以,你想要做像

// Create connection 
SqlConnection connection = ObtainSqlConnection() 

// Create transaction 
SqlTransaction sqlTransaction = connection.BeginTransaction(); 

try 
{  
    foreach (Action action in collectionOfActionsToPerform) 
    { 
     action.Publish(sqlTransaction) 
    } 

    sqlTransaction.Commit(); 
} 
catch 
{ 
    sqlTransaction.Rollback(); 
} 

一些嘗試張貼一些僞代碼,如果這是一種誤解。

0

一些交易的最佳做法是:

  • 保持事務儘可能短
  • 訪問儘可能少的數據儘可能在交易

在企業庫方面,DAAB是System.Transaction知道,所以我會使用TransactionScope。根據你說的話是這樣的:

Database database = DatabaseFactory.CreateDatabase(); 

using (TransactionScope scope = 
    new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    foreach(MyClass myClass in myClasses) 
    { 
     myClass.Publish(database); 
    } 

    scope.Complete(); 
} 

這個例子沒有錯誤處理,並假設如果事務需要回滾一個異常被拋出。

看來你的交易涉及大量的記錄,並且需要相當長的時間。您在交易中更新了多少條記錄?您的交易持續多久?所有的SQL語句都需要在一個事務中進行,還是可以將它們分解爲較小的事務?

您是否嘗試過配置SQL語句以確保其效率。同時檢查你是否沒有拿出過多的鎖並獲取鎖定/阻塞問題。