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

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

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

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

我们目前正在做以下事情:

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

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

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

最佳答案

您输入错误,或者问题可能是因为您将 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();
}

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

关于c# - 跨多个事务管理 SQL 数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212816/

相关文章:

database - 我应该将每个数据库调用包装在事务中吗?

java - 重复插入

c# - 如何在 C# 中将 "import"设置为静态类?

sql-server - 无法在具有唯一索引的对象中插入重复的键行。重复的键值。该语句已终止

sql - 移动平均线/滚动平均线

Java NetBeans JDBC 连接在调试中工作,而不是在运行中

mysql - MySQL 工作台是否显示未提交的更改?

c# - 在 C# 中替换同时包含波斯语和英语字母的字符串

c# - Azure API 管理将请求 ClientConnectionFailure 转发到应用服务 API

c# - 使用 Flurl 通过 POST 嵌套值