跨多个事务管理SQL数据库连接

时间:2009-07-31 14:22:00

标签: c# sql-server transactions enterprise-library connection-pooling

我们有一个DAL需要在一个我们可以回滚或提交的事务中包装许多数据库插入。

处理该问题的最佳做法是什么?

我们目前正在执行以下操作:

  1. 创建数据库连接和交易
  2. 使用代表要执行的操作的所有类填充集合。通过构造函数传递连接。
  3. 在try / catch中,遍历所有动作类并调用它们的Publish()方法
  4. 如果成功则提交(关闭连接)或在出现错误时关闭(关闭连接)。
  5. 这个过程可能需要一段时间,而且我们似乎用完了池化的数据库连接。有没有更好的方法来管理交易?

    这是使用SQL 2008,.net 3.5和4.1版本的企业库数据访问。

3 个答案:

答案 0 :(得分: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();
}

如果这是一个误解,请尝试发布一些伪代码。

答案 1 :(得分:0)

看一下MySpace网站与SQL Server技术一起使用的实现。

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004532

他们使用SQL Server Service Broker来管理数百个数据库中的数据库事务。

答案 2 :(得分: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语句以确保它们有效。还要检查您是否没有取出过多的锁并解决锁定/阻塞问题。