叶子的家

~●    ~●  ~●          ~●   ~●~●                           ○
    离成功还很远,距离长着叻,Fighting!
随笔 - 44, 文章 - 1, 评论 - 697, 阅读 - 22万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年6月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

Castle实践3-Castle.Services.Transaction

Posted on 2005-06-25 12:23  绿叶  阅读(6397)  评论(3)    收藏  举报

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~
编辑推荐:
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
阅读排行:
· 基于.net6的一款开源的低代码、权限、工作流、动态接口平台
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· Claude Code 初体验 - Windows
· 基于 C# 编写的轻量级工控网关和 SCADA 组态软件
· 纯C#软实现openGL(V0.1),黑盒变白盒
点击右上角即可分享
微信分享提示