关于事务的一些学习笔记
今天在整理资料的时候发现了之前学习事务的时候的一些学习笔记,顺便写篇blog记录一下备以后查验。
?
?
?
? 在我们日常系统开发当中,我们是不是不可避免的要对一些数据资源进行访问,但是我们怎么来保证我们对数据资源的访问不会破坏数据资源的完整性呢?这个时候就需要事务了,正是引入了事务的概念,我们平时对数据资源进行操作的时候才不会破坏数据资源的完整性或者说是不变量约束。1.2 何为事务前面从事务目的的角度说明了事务到底是什么,那么事务又是达到保证数据资源完整性的目的的呢?这需要我们来了解一下事务的特征,事务一共有四个特性(ACID),分别是原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性—urability).
2.1 原子性何为原子性?之前说了事务需要保证数据资源的完整性,那么我们就需要控制对数据资源的访问,使得对数据资源进行访问的操作要么全部成功,否则只要一个操作失败,那么全部失败(虽然有点极端^_^,但是很必要),这样数据资源就不会因为一部分操作成功,但是一部分操作失败而引起系统不一致。
2.2 一致性何为一致性呢?一致性就是说,当我们在对数据资源的一次访问过程中,在访问之前和访问之后,数据资源的状态都要处于一种完整的,满足不变量约束的状态。(比如银行转账,当从账户A转账到账户B后,账户A和账户B的金额总和是不变的,这就是一种不变量约束)。
其实一致性也说出了事务的心声,这也正是事务的目的,但是要想实现此目的,事务必须满足其它的三条特征,原子性,隔离性,持久性是一致性的必要条件。
?
2.3 隔离性?
以上是事务的四特征,下面主要来说说事务的隔离性问题,对于事务的隔离性问题,ANSI标准规定了四个隔离级别,如下:
3 事务的隔离级别* ?? 乐观所
*?? 悲观锁
* ?乐观离线锁
*?悲观离线锁
1 资源管理器(Resource Manager):资源管理器一般是数据库管理系统,也可以是消息队列,遗留系统等。
2 分布式事务协调者—istributed Transaction Coordinator,DTC)【1】:此功能一般是有我们所用的JavaEE应用服务器实现,比如jboss,websphere,weblogic等。这个角色只有在JTA事务中才会存在。
3 事务管理器(Transaction manager):每一个事务管理器都与相应的资源管理器所关联,它负责对分布式事务进行提交或者回滚。
4 应用程序(Application)
?
以上四者的关系可以用以下的图形来形象的表述:
在日常的系统开发中,我们一般都会使用数据资源(比如数据库)来对系统的状态进行保存,那么我们根据系统涉及的数据资源的多少,将事务分为RESOURCE-LOCAL事务或者JTA全局分布式事务。
1? RESOURCE-LOCAL事务全局事务是涉及多个资源管理器,此时需要引入事务协调者来进行调节,此时就需要两阶段提交协议2PC(two phase commit),下面简要说一下两阶段提交协议。
第一阶段:事务协调者发送“准备提交”消息给事务所涉及的所有的事务管理器,然后事务管理器又分送此消息给相应的资源管理器,然后事务管理器又将资源管理的响应情况告诉分布式事务协调者—TC).只有此阶段顺利完成后(既所有的资源管理器都同意提交事务),才会进入第二阶段。
第二阶段:当第一个阶段顺利完成后,事务协调者告诉事务管理器去提交事务。
我们可以形象的用下图对分布式事务的参与者进行描述:
?
?
上图描述一种场景,一个分布式事务中需要操作两个数据库和一个JMS服务器,在这种场景下,在进行事务操作的时候,对于DB来说,首先事务管理器从支持XA接口的JDBC驱动程序中取得对应的javax.transaction.xa.XAResource实现类, 然后从相应的JDBC驱动中获取到javax.sql.XAConnection的实现类,其中XAResource对应用程序是透明的,应用程序只需要拿到XAConnection进行操作数据库即可,对于JMS过程类似,首先从支持XA的JMS消息中间件获取javax.transaction.xa.XAResource,然后再获取javax.jms.XAConnection的实现类,这里XAResource同样对应用程序是透明的。
四:参考文献