2

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

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

我们目前正在做以下工作:

  1. 创建数据库连接和事务
  2. 用代表要执行的操作的所有类填充集合。通过构造函数传入连接。
  3. 在 try/catch 中,遍历所有动作类并调用它们的 Publish() 方法
  4. 如果成功则提交(关闭连接),如果错误则回滚(关闭连接)。

该过程可能需要一些时间,并且我们似乎用完了池数据库连接。有没有更好的方法来管理交易?

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

4

3 回答 3

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();
}

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

于 2009-07-31T15:01:12.077 回答
0

看看 MySpace 网站使用 SQL Server 技术的实现。

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

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

于 2009-07-31T15:02:00.563 回答
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 语句以确保它们是有效的。还要检查您是否没有使用过多的锁并出现锁定/阻塞问题。

于 2009-08-21T04:10:50.660 回答