使用什么 - 我的架构中的SqlTransaction或TransactionScope

Sha*_*pta 2 .net transactions transactionscope

我们使用3层建筑,其中包含SqlHelper - > DAL(数据访问层) - > BAL - > UI

DAL中的任何类都可以调用另一个DAL,任何BAL都可以调用另一个BAL或DAL.

例如.

class Customer_DAL { display_CusDal(); }
class Customer_BAL { display_CusBal(); }   

class Product_DAL { display_ProDal(); }
class Product_BAL { display_ProBal(); }


display_CusDal()
{
 //call display_ProDal()
 //Do some work
}
Run Code Online (Sandbox Code Playgroud)

display_CusDal 函数应作为事务运行,实体意味着在此函数中进行的任何插入都应与事务对象相关联.

由于display_CusDal可以调用display_ProDal,这可能会也可能不会在另一个事务中的表中插入数据,所以我需要在事务中处理这些.

我应该使用什么方法.

pjv*_*vds 7

SqlTransactions仅适用于SQL,并要求您显式添加它们的使用.TransactionScope的优点是更多的各方可以加入该交易.所以不仅是SqlTransactions,还包括其他类型的事务.使用事务范围时也会占用大量代码.

另一方面,使用事务范围可能会引入相当一些奇怪的行为.在模糊的情况下,东西会升级到MSDTC.

对于您的情况,交易范围听起来像是最好的选择.通过这种方式,可以非常容易地在单个事务中加入对同一DAL 上的Customer_DALProduct_DAL/或多个操作执行的多个操作.

Pro的SqlTransactions

  • 容易明白.
  • 明确的
  • 你有完全控制权.

Con的SqlTransaction

  • 需要更多代码.
  • 更难加入更多派对.
  • 更难加入其他交易.
  • 将事务绑定到SQL(因此切换到其他持久存储时不支持)

适用于TransactionScope的专业版

  • 使用方便.
  • 保持您的代码简单,您不必担心Customer_DALProduct_DAL混合.
  • 出色的交易管理开箱即用.包括使用多个数据库时升级到MSDTC.

用于TransactionScope的Con

  • 升级发生时模糊不清.

  • @ShantanuGupta TransactionScope可以将事务升级到MSTDSC,MSTDSC是多方加入事务时使用的分布式事务服务.例如,多个数据库.因此,当在单个事务范围内查询多个数据库时,事务管理器会将事务升级到MSDTSC.有关升级(和问题)的大多数信息可以在这里阅读:http://stackoverflow.com/questions/1690892/transactionscope-automatically-escalating-to-msdtc-on-some-machines (3认同)
  • 一个重要的注意事项是,到同一数据库的多个连接也会使事务升级. (2认同)

Tom*_*ter 5

我只是想在@pjvds 回复中添加一些关于将事务提升到 MSDTC 的重点。我们曾尝试使用 TransactionScope,它在我们的开发环境中运行良好。我们的代码总是导致提升,但我们的开发机器恰好安装、打开和配置了 MSDTC。然后我们部署到我们的生产服务器,但事情并没有奏效。MSDTC 已关闭。我们的一些生产服务器位于我们无法控制服务器的客户端位置。我们不想要求我们的客户打开和配置 MSDTC。所以我们拿出了 TransactionScope 并推出了我们自己的。