日期:2014-05-18  浏览次数:20665 次

熬之滴水成石:Spring--精简的J2EE(9)

                                                                                                              51--事务处理

在Spring中处理事务有两种:一种为声明式另一种为编程式的事务。对于事务的理解可以认为是作为单个逻辑工作单元执行的一系列操作。 作为事务必须有这样的特性:原子性,一致性,独立性,可靠性。在J2EE中,是可以实现将几个数据库调用当作一个事务来对待,并且当不是全部成功的时候可进行回滚操作。

在传统的J2EE容器中,我们有两种选择来管理事务,一个是从JNDI中获取UserTransaction,然后使用该类的方法,让程序知道什么开始,什么提交,什么时候回滚。

在基于Spring的应用程序中使用事务,能够保证数据的可靠性,让你集中精力写业务逻辑。在传统的J 2 E E容器中,你有两种选择来管理事务边界:通过编码方式从JNDI中获取一个UserTransaction,然后调用UserTransaction.begin(),UserTransaction.commit()或UserTranscation.rollback()就可以了,当然还可以使用容器托管的事务(Container-Managed Transactions,CMT),这就需要在部署描述文件中为每个EJB方法定义事务的属性(transaction attribute)让容器决定何时开始和结束一个事务。我们往往可以通过定义传播行为的方式在CMT和SPRING中设置事务的行为。但凡事务的行为有6种方式,各种方式都有一个参数名:Required、Supports 、Mandatory、Requires new、Not Supported、Never。默认的都是Required,它表示在当一个当前的事务中执行,如果没有现成的话便新建一个。

在Spring中,也定义了类似的属性。事务有效的保证了流程的结束或回滚,这有利于保证流程修改的数据。隔离层用来描述数据对其事务的可见形式。当一全事务的数据对其它事务来说是不可见的,它被称为完全事务隔离或是可串行化事务。这只是一个概念,但却与性能关系密切,使用一个较少限制的隔离层有助于更好的性能。按照SQL标准定义了4种隔离:Serializable、Repeatable Read Committed、Read Uncommitted,在Spring中多半采用的方法是Seriaizable隔离是保证数据精确性的最佳选择,但同时也是效率最差的。当性能比数据完整性更重要时,建议使用一个更低级别的隔离。

在事务管理上,我们可以把事务分为局部和全局。局部事务特指一种资源,而全局事务主要依赖一个使用JTA的事务管理器。全局资源就能够跨多个数据库进行使用,虽然全局事务功能强大,但局部的事务其实已经足够了。Spring中的IoC容器通过注入的Transaction Manager,JTA本身就是J2EE中的一种规范。JTA事务能够在组件间进行传递,并且能在事务内通过组件访问的方式传递给企业信息系统。其实这里面最为重要的是,开发人员可能更注重于代码的编写,而不需要知道事务是如何应用到各种资源的。虽然资源是为各种容器基准配置的,J2EE应用并不包括任何有关事务的信息。容器负责处理各种事务,并能优化单个资源的事务。而在Spirng中的事务则是通过使用的API就可以完成了,与J2EE截然不同的是,J2EE中对于编程式的事务,你必须从JNDI中查找一个UserTransaction对象。使用Api则省去了这个操作,Spring的框架让事务变得简单起来。Spring中的PlatFormTransactionManager接口来实现事务管理的。对于编程式事务,你可以使用TransactionTemplate类,对于声明式事务,结合Aop使用TransactionInterceptor,这两种方法都会与一个platformtransactionManager交互并且从TransactionDefinition中获得。TransactionDefinition接口声明了事务设置,像传播行为、隔离级别或超时设置。DefalultTransationAttribute用于声明式的事务。在编程中事务,Spring中使用TransactionTemplate,不仅代码简单,而且并不需要捕捉异常。Spring提供了两种不同的划分事务的方法:PlatformTransactionTemplate类和PlatformTransactionManager。我们常用的就是TranscationTemplate类有个核心的execute方法,这是使用回滚途径,一种是TransacitonCallback类,它允许execute返回一个值。在实际编程中,我们只需要为使用的类增加一个bean的映射,为TransatcionManager添加属性,引用transaacitonManger bean.还有一种高深的用法就是PlatformTransactionManger,用逻辑管理在抛异常时回滚事务。而声明式事务是使用XML来指定事务属性的能力,这种方法的优点是在编写者也许不知道代码的事务行为,减少了输入,这种方式可以提高多个对象的事务属性。

Spring中的事务管理相对来说是简单有效的,它省去了从JNDI中查找UserTransaction带来的繁琐,而直接使用PlatformtransactionManager。为了减少和消除处理异常的必要操作,你可使用TransactionTemplate及其回调操作,也可以在XML中使用声明式事务处理。Spring的出现解决了J2EE中山会用使用事务的麻烦,在Spring中可以为任一的POJO定义事务,在进行扩展时,使用单个DataSource或者多个都可以使用,而这些只需要使用相关的类便可以实现..........