spring学习笔记8——事务管理

时间:2022-07-28 18:00:47

一、事务的概述

        事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所以操作都做,要么所以操作都不做,这就是

        事务。

        事务必须满足ACID特性

        1)原则性(Atomicity):即事务是不可分割的最小工作单元,事务要么全做,要么全不做

        2)一致性(Consistency):一旦事务完成(不过成功还是失败),系统必须确保他所建模的业务处于一致的状态。显示的数据不应该

             被损坏。

        3)隔离性(Ioslated):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔

              离性。

        4)持久性(Durable):事务一旦执行成功,它对数据库的数据的改变必须是永久的。这样就能从任何的系统崩溃中恢复过来。

 

二、事务管理器

        Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务

           实现

        Spring提供内置事务管理器的实现

        spring学习笔记8——事务管理

        事务的配置:

        1)JDBC事务

              <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

                         <property name="dataSource" ref="dataSource"/>

              </bean>

              注:dataSource为数据源

        2)hibernate事务

              <bean id="txManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">

                         <property name="sessionFactory" ref="sessionFactory" />

             </bean>

             注:sessionFactorysession工厂

       3JPA事务

             <bean id="TxManager" class="org.springframework.orm.jpa.JpaTransactionManager">

                        <property name="entityManagerFactory" ref="entityManagerFactory"></property>       

             </bean>

             注:entityManagerFactory指定需要事务管理的Javax.persistence.EntityManagerFactory对象。还有为该对象指定jpaDialect属性,该属性所

             对应的对象指定了如何获取连接对象、开启事务、关闭事务等事务管理相关行为。

 

三、 声明式事务

         Spring对声明式事务的支持是通过spring AOP实现的

         1、定义事务的属性:

               1)传播行为:定义了客户端与调用方法直接的事务边界

               2)隔离级别:定义了一个事务受其他事务影响的程度

               3)是否只读:设置只读数据库可以对一些操作进行优化

               4)事务超时:限定事务的时间

               5)回滚原则:设置事务在遇到哪些异常时回滚

 

         2、声明式事务管理的相关配置

               1)在XML中定义相关的命名空间

                     spring学习笔记8——事务管理

                     注:之所以要用到AOP的命名空间,是因为声明式事务配置元素依赖于部分spring AOP的配置元素

 

               2)配置事务

                    spring学习笔记8——事务管理

                    1 <tx:advice>:事务通知定义,用于指导事务属性,其中transaction-manager属性指定事务管理器

                    2<tx:attributes>:指定具体拦截的方法

                    3<tx:method>:用name属性指定方法,比如name=”save*”表示拦截以save开头的方法。其中method还有五个属性,propatation

                          示传播行为、isolation表示隔离级别、read-only表示是否只读、timeout表示事物超时、no-rollbace-for表示回滚原则。其中属性

                          的具体值请看API

        3、定义通知器  

              spring学习笔记8——事务管理

             <aop:pointcut>用于定义切点,experssion表示切入点表达式,我这里表示的是service包下的所以方法。

             <aop:advisor>pointcut-ref表示切入点,advice-ref示事务。

 

          这里,基于XML配置的声明式事务就完成了

 

         4、基于注解声明事务

              基于注解的声明式事务其实很简单,它不需要在配置文件中配置事务和通知器。只需要在配置文件中加入<context:annotation-

              config/>表示启用注解,记得还有添加context的命名空间。<tx:annotation-driven transaction-manager="txManager"/>表示基于注解的事务

              管理,transaction-manager值指向事务管理器。

              接着,我们只需要在需要事务管理的bean或方法上加入@Transactional即可。@Transactional()括号里可指明事务的属性比如

              @Transactional(isolation=Isolation.SERIALIZABLE)

 

四、编程式事务

         所谓的编程式事务就是通过编码方式实现事务

         在配置文件中,只需配置事务管理器,并将配置管理器注入相应的bean

         spring学习笔记8——事务管理

         UseDao的代码:

         spring学习笔记8——事务管理

         1)UserDao继承了hibernateDaoSupport(不是重点)

         2)这里setTransctionManager()以注入的TransactionManager作为参数,获取一个TransactionTemplate模板类。

         3)TransactionTemplateset*来设置事务的属性,例子中setPropagationBehavior就是用来设置传播行为。

         4)TransactionTemplate有两个回调模板,一个是例子中使用的TransactionCallbackWithoutResult(),表示没返回值,另一TransactionCallback

               (),表示有返回值。

        5)TransactionTemplate通过execute来执行需要事务的回调