事务属性
当在面向服务的应用程序中使用事务时,必须遵守四个核心属性,也就是ACID:原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和持久性(Durable)。
注意点
在一个事务处理中,不要访问非事务的资源很关键(如文件系统),因为事务一旦被中止,是不会回滚这些非事务资源上的改变。
事务管理
WCF服务能够直接处理事务性的资源,并通过显式地使用编程模型(如ADO.NET)来管理事务。如下,使用这个模型,可以显式地启动和管理事务。
class MyService : IMyContract
{
public void MyMethod()
{
string connectionString = "....";
using (IDbConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (IDbCommand command = new SqlCommand())
{
command.Connection = connection;
using (IDbTransaction transaction = connection.BeginTransaction())
{
command.Transaction = transaction;
try
{
//这里操作数据库
transaction.Commit(); //提交事务
}
catch (Exception)
{
transaction.Rollback(); //回滚事务
throw;
}
}
}
}
}
}
分布式事务
一个分布式事务包含两个或多个独立的服务(通常在不同的执行上下文里),或者一个服务包含多个事务资源。
对于一个分布式事务,需要依赖两阶段提交协议和一个事务管理器。事务管理器是管理事务的第三方,由它来负责客户端和服务端两阶段提交协议。
第一阶段,事务管理器询问参与到事务里的所有资源是否对于提交事务期间的修改还有什么意见。 注意,事务管理器不会命令资源提交修改,而只是询问它们的意见。第一阶段结束时,事务管理器会综合所有的资源投票结果。
第二阶段,根据投票结果来执行。如果所有的资源都投票提交事务,那么事务管理器会告诉所有的资源提交修改。但是,如果任何一个资源没有提交修改,那么资源管理器会告诉其余的资源回滚修改,然后终止事务,并把系统恢复到事务之前的状态。
资源管理器
资源管理器(RM)是由某个事务管理器管理的、支持原子操作和两阶段提交协议的资源。这个资源必须可以检测自己是否被包含进了事务,而且是否有且只有一次的自动那个加入事务列表。RM可以处理持久化和非持久化资源,比如,事务性整数、字符串和集合。虽然RM必须支持两阶段提交协议,但是,他可以选择使用优化协议。这个协议称为一阶段提交协议,事务管理器(TM)会一次性通知事务管理器执行的结果。
资源管理器在整个事务模型中主要承担如下几种职能:
- 帮助应用实现对目标资源的操作;
- 注册到相应的事务管理器,以便事务回滚得时候可以从事务管理器中接收到恢复请求,实现对数据的恢复;
- 向相应的事务管理器报告本地事务的结果;