System.Transactions.TransactionScope为了提供一种非常方便的实现分布式事务的方式,但是在某些情况下为了阻止本地事务向分布式事务提升,我们只能通过DbTransaction进行事务控制。在进行数据库操作的时候,我们经常会遇到这样的事务场景:当某个方法单独执行的时候,它应该在一个单一的DbTransaction中执行;当多个方法一起执行的时候,它们应用共同在DbTransaction中执行。在本篇文章中我们通过对DbTransaction进行封装,提供一种类似于TransactionScope的编程方式来解决这个问题。[源代码从这里下载]

目录
一、自定义的Transaction
二、自定义CommittableTransaction和DependentTransaction
三、自定义TransactionScope
四、一个具有事务感知的DbHelper
五、三种事务控制的性能

我们完全采用System.Transactions的应用编程接口的设计定义基于DbTransaction的相关类型,首选来看看具有如下定义的表示事务的Transaction类型。Transaction是一个抽象类,具有DbTransactionWrapper和Completed两个属性,前者表示对DbTransaction的封装,后者表示事务操作是否已经完成。静态属性Current表示当前事务,这是一个基于当前线程的静态字段。Rollback和Dispose直接调用了DbTransactionWrapper的同名方法。

namespace Artech.Transactions
   2: {
class DbTransactionWrapper: IDisposable
   4:     {
public DbTransactionWrapper(DbTransaction transaction)
   6:         {
this.DbTransaction = transaction;
   8:         }
private set; }
bool IsRollBack { get; set; }
void Rollback()
  12:         {
this.IsRollBack)
  14:             {
this.DbTransaction.Rollback();
  16:             }
  17:         }
void Commit()
  19:         {
this.DbTransaction.Commit();
  21:         }
void Dispose()
  23:         {
this.DbTransaction.Dispose();
  25:         }
  26:     }
class Transaction : IDisposable
  28:     {
  29:         [ThreadStatic]
static Transaction current;
  31:  
private set; }
protected set; }
protected Transaction() { }
void Rollback()
  36:         {
this.DbTransactionWrapper.Rollback();
  38:         }
public DependentTransaction DependentClone()
  40:         {
this);
  42:         }
void Dispose()
  44:         {
this.DbTransactionWrapper.Dispose();
  46:         }
static Transaction Current
  48:         {
return current; }
value; }
  51:         }
  52:     }
  53: }

相关文章: