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: }