zoukankan      html  css  js  c++  java
  • 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~
  • 相关阅读:
    如何备份Chrome浏览器收藏夹
    Postman初接触
    Fitness初接触
    selenium向IE的输入框中输入字符时特别慢
    Test Case Design Method
    decision table
    Pair Testing
    selenium python 报错“ unable to find binary in default location”
    Eclipse+Pydev环境下出现error “eclipse Non-UTF-8 code”
    Eclipse + pydev插件
  • 原文地址:https://www.cnblogs.com/wj/p/180959.html
Copyright © 2011-2022 走看看