在事务内打开和关闭数据库连接

Dan*_*n H 9 .net connection ado.net transactions

我设计了框架的数据访问部分,以便每次业务对象(BO)需要与数据库交互时,都必须打开连接,调用数据访问层(执行查询),然后关闭连接.然后,如果需要在事务中运行,它将打开连接,开始事务,调用数据访问层(执行查询),然后提交事务,关闭事务,最后关闭连接.

我这样做的方式是"开放晚,早关闭" ...但是如果我需要调用其他BO在单个交易中提交数据怎么办?有没有更好的方法来处理打开和关闭连接以及处理事务?

我是设计应用程序架构的新手,所以我希望我不会错误地做这个......任何帮助都是值得赞赏的.

Tho*_*mas 5

如果给定的业务对象需要在事务中执行各种方法,请使用TransactionScope如下:

using ( var transactionScope = new TransactionScope() )
{
    this.Save();
    childObjA.Save();
    childObjB.Save();
    childObjC.Save();
    childObjD.Save();

    transactionScope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

如果任何对象抛出异常,它将回滚事务.

有关更多信息,请参阅MSDN参考页面TransactionScope.

  • 虽然`TransactionScope`*是*这里使用的类,但OP的当前设计会导致分布式事务,或者如果MSDTC被禁用或锁定,则可能导致异常.这可能*不是理想的结果. (3认同)
  • @Aaronaught,在SQL Server 2008和.NET 3.5中,该事务不会被提升为分布式事务(对于当前设计)。 (2认同)
  • @Tuzo:是的,使用SQL Server 2008,你可以欺骗多连接问题**如果**所有连接都在同一个数据库****并且只有一个同时打开.这仍然是一个非常值得怀疑的做法,特别是当替代设计更容易构建/维护时. (2认同)