我们有一个DAL需要在一个我们可以回滚或提交的事务中包装许多数据库插入。
处理该问题的最佳做法是什么?
我们目前正在执行以下操作:
这个过程可能需要一段时间,而且我们似乎用完了池化的数据库连接。有没有更好的方法来管理交易?
这是使用SQL 2008,.net 3.5和4.1版本的企业库数据访问。
答案 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语句以确保它们有效。还要检查您是否没有取出过多的锁并解决锁定/阻塞问题。