Castle Project Project.Pervices.Transaction:
提供事务的封装和默认的事务管理服务器,其他几个Facility都是以他为基础,比如:AutomaticTransactionManagement、NHibernate等。 下面让我们从接口着手了解他对事务做了怎样的封装。
IResource:实现了此接口代表一个可以参与事务的资源
public interface IResource
{
// 在ITransaction.Begin()ITransaction.Enlist()时调用(准备动作)
void Start();
// 在ITransaction.Commit()时调用(提交动作)
void Commit();
// 在ITransaction.Rollback()时调用(回滚动作)
void Rollback();
}
{
// 在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.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; }
}
{
// 准备事务,初始化所属资源
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);
}
{
// 创建一个事务
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
}
{
Unspecified,
Requires,
NotSupported,
RequiresNew,
Supported
}
事务隔离级别:
public enum IsolationMode
{
Unspecified,
Chaos = 0,
ReadCommitted,
ReadUncommitted,
RepeatableRead,
Serializable
}
{
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~