.NET:如何在System.Transactions中禁用升级?

and*_*eas 6 .net msdtc

是否可以使用System.Transactions编程模型而不支持分布式事务?

就像是

  TransactionConfig.DisablePromotion = true;
Run Code Online (Sandbox Code Playgroud)

Ran*_*ica 10

不,您无法通过属性或配置禁用事务促销.禁用事务提升的唯一方法是避免导致事务被提升为分布式事务的条件.

为避免事务管理升级,您需要:

  • 将SQL Server 2005或更高版本作为数据库

  • 如果是SQL Server 2005,则在事务的生命周期内仅使用一个数据库连接.(SQL Server 2008允许您在事务中使用多个连接而不进行升级.)

  • 只访问一个数据库

  • 不跨应用程序域传递您的事务


规则的原因是确保事务的ACID属性.

举个例子,让我们假设您可以指定不提升事务(如在代码片段中)但您的代码访问两个数据库(我知道 - 您的代码只使用一个数据库).所以现在你已经指定不使用分布式事务,你已经启动了一个事务,并且你已经指定两个数据库都应该在这一个工作单元内.事务的ACID属性与避免分布式事务的期望之间存在冲突.在我看来,有两种方法可以解决这个问题:将事务提升为分布式事务(你说你不想这样做!)或抛出异常(因为你不能保证事务的完整性)交易).

因此,使用DisablePromotion属性没有多大价值,因为对于不促进事务的应用程序,您仍然需要遵循升级规则.

如果您真的想要,可以处理DistributedTransactionStarted事件并在启动分布式事务时抛出异常.这可以保证您的应用程序不使用分布式事务,但这可能不是您想要的.

  • 如果由于访问两个数据库而正在提升事务,但是您只是“写”到一个数据库,则可以通过在访问另一个数据库时抑制事务来避免升级。即`using(new TransactionScope(TransactionScopeOption.Suppress,new TransactionOptions {IsolationLevel = IsolationLevel.ReadUncommitted})){//访问其他数据库}` (2认同)