Castle实践3-Castle.Services.Transaction

Castle Project Project.Pervices.Transaction:
    提供事务的封装和默认的事务管理服务器,其他几个Facility都是以他为基础,比如:AutomaticTransactionManagementNHibernate等。 下面让我们从接口着手了解他对事务做了怎样的封装。


IResource:实现了此接口代表一个可以参与事务的资源

public interface IResource
{
    
// 在ITransaction.Begin()ITransaction.Enlist()时调用(准备动作)
    void Start();
    
// 在ITransaction.Commit()时调用(提交动作)
    void Commit();
    
// 在ITransaction.Rollback()时调用(回滚动作)
    void Rollback();
}


ISynchronization:用于同步处理

public interface ISynchronization
{
    
// 在ITransaction.Commit()与ITransaction.Rollback()之前调用
    void BeforeCompletion();
    
// 在ITransaction.Commit()与ITransaction.Rollback()之后调用
    void AfterCompletion();
}


接口ITransaction:代表一个事务

public interface ITransaction
{
    
// 准备事务,初始化所属资源
    void Begin();
    
// 提高事务
    void Commit();
    
// 回滚事务
    void Rollback();
    
// 获取当前事务状态
    TransactionStatus Status { get; }
    
// 加入一个共享资源
    void Enlist(IResource resource);
    
// 加入一个同步对象
    void RegisterSynchronization(ISynchronization synchronization);
    
// 资源上下文环境,可以附加额外的信息
    IDictionary Context { get; }
}


接口ITransactionManager:代表一个事务管理器

 
public interface ITransactionManager 
{
    
// 创建一个事务 
    ITransaction CreateTransaction( TransactionMode transactionMode, IsolationMode isolationMode ); 
   
// 获取当前的事务 
    ITransaction CurrentTransaction 
    { 
       
get
    }
    // 销毁特定事务的资源 
    void Dispose(ITransaction transaction); 
}



AbstractTransaction实现了ITransaction接口:
    他提供基本的事务资源与事务同步资源的管理和相应的处理逻辑。

StandardTransaction继承于AbstractTransaction类:
    在AbstractTransaction的基础上提供子事务支持。这里为了区别事务的父子关系,就分别将他们称为:父事务和子事务吧。
    一个父事务可以包含多个子事务,一个子事务还可以包含子子事务,在任何一个子事务发生回滚的时候,事务链上的所有事务都不能Commit只是Roolback。

事务模式:
public enum TransactionMode 
{
    Unspecified,
    Requires,
    NotSupported,
    RequiresNew,
    Supported
}


事务隔离级别:
public enum IsolationMode
{
    Unspecified,
    Chaos 
= 0,        
    ReadCommitted,    
    ReadUncommitted,
    RepeatableRead,
    Serializable
}

DefaultTransactionManager实现了ITransactionManager:
    他提供默认的事务管理器,主要负责创建事务和提供当前事务。创建不提供事务隔离级别支持。根据指定的“事务模式”,创建父事务和子事务。不过你完全可以定制自己的事务管理器。
    下面来看看如何使用默认事务管理器:

1)创建一个事务管理器:
    DefaultTransactionManager tm = new DefaultTransactionManager();
2)从事务管理器中创建一个事务:
    ITransaction transaction = tm.CreateTransaction(TransactionMode.Unspecified, IsolationMode.Unspecified);
如果指定TransactionMode为Unspecified,则事务管理器使用默认的TransactionMode.Requires。这样就创建了一个父事务。
3)父事务创建之后,再以Unspecified或者Requires创建事务,则新创建的事务自动成为父事务的子事务。
4)如果不想创建子事务,则用RequiresNew来创建。

    使用默事务管理器需要注意一下几点:
1)默认的事务管理器都一个堆栈管理,CurrentTransaction返回的始终是最后一个创建的事务。
2)子事务可以有子子事务。
3)创建事务的时候,父事务和子事务的顺序要一定。如果创建了一个父事务后,再创建就是一个子事务,再来就是一个子子事务。除非你用了RequiresNew后,就重新往返这个过程。



这次介绍到这里,如果我理解的不正确,请大家多多指点。3q~
原文地址:https://www.cnblogs.com/wj/p/180959.html