spring声明式事务管理配置及说明

来源:互联网 发布:iwebshop 数据库字典 编辑:程序博客网 时间:2024/04/29 11:46

一、spring声明式事务管理配置及说明(配置在配置文件中,此处的配置文件名称为:applicationContext.xml)http://write.blog.csdn.net/postedit/12023941


    Spring中配置声明式事务管理:

         Hibernate:

   

[html] view plaincopyprint?
  1. <!-- 配置sessionFactory 与相关的模型类 -->  
  2.     <bean id="sessionFactory"  
  3.         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  4.         <property name="dataSource" ref="dataSource"></property>  
  5.         <property name="hibernateProperties">  
  6.             <props>  
  7.                 <!-- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> -->  
  8.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>  
  9.                 <prop key="hibernate.show_sql">true</prop>  
  10.                 <prop key="hibernate.format_sql">true</prop>  
  11.                 <prop key="hibernate.hbm2ddl.auto">none</prop>  
  12.             </props>  
  13.         </property>  
  14.         <!-- 加入注解形式的模型类 所在包 -->  
  15.         <property name="packagesToScan">  
  16.             <list>  
  17.                 <value>com.coffee.model</value>  
  18.             </list>  
  19.         </property>  
  20.     </bean>  
  21.   
  22.     <!-- 声明事务处理器 -->  
  23.     <bean id="hibernateTransactionManager"  
  24.         class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
  25.         <property name="sessionFactory" ref="sessionFactory"></property>  
  26.     </bean>  
  27.   
  28.     <!-- 声明事务通知 -->  
  29.     <tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">  
  30.         <tx:attributes>  
  31.             <!-- propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 -->  
  32.             <tx:method name="find*" propagation="REQUIRED"  />  
  33.         </tx:attributes>  
  34.     </tx:advice>  
  35.       
  36.     <!-- 声明式事务管理:定义切面 -->  
  37.     <aop:config>  
  38.         <!-- 定义切入点 expression="execution(* com.test.testAda.test.model.service.*.*(..))"   
  39.             其中第一个*代表返回值,第二*代表service下子包,第三个*代表方法名,“(..)”代表方法参数。   
  40.                         注意第一个*后面要打一个空格,要不然会报表达式错误-->  
  41.         <aop:pointcut expression="execution(* com.coffee.service.*.*(..))"  
  42.             id="serviceMethod" />  
  43.         <!-- 把切入点和事务通知联系起来 -->  
  44.         <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>  
  45.     </aop:config>  
     

       配置代码说明:

            <tx:advice></tx:advice>:该标签会创建一个事务处理通知。我们所需做的就是创建一个切入点,该切入点匹配所有带事务的方法引用事务性通知。

           <tx:method></tx:method>标签的属性:

              name:方法名的匹配模式,通知根据该模式寻找匹配的方法;

              propagation:设定事务定义所用的传播级别;(传播)

              isolation:设置事务的隔离级别;(隔离)

              timeout:指定事务的超时(秒);

              read-only:该属性为true表示事务是只读的;

              rollback-for:以逗号分隔的异常类的列表,当目标方法抛出这些异常时会导致通知执行回滚,默认值为空;

              no-rollback-for:以逗号分隔的异常类的列表,当目标方法可以抛出这些异常不会导致通知执行回滚;

       

二、Spring事务类型详解

  <prop key = "load">PROPAGATION_REQUIRED,READONLY</prop>

  <prop key = "store">PROPAGETION_REQUIRED</prop>

Spring中常用事务类型(传播行为):

    PROPAGETION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择;

    PROPAGETION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行;

    PROPAGETION_MANADTORY:支持当前事务,如果当前没有事务,就抛出异常;

    PROPAGETION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前的事务挂起;

    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前的事务挂起;

    PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常;

    PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则进行与

                                                        PROPAGATION_REQUIRED类似的操作。

   Spring中的事务隔离级别:

            default:默认级别,对大多数数据库来说就是--read_committed

            read_uncommitted:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。

                                                  这种隔离级别会产生脏读,不可重复读和幻像读。 大部分数据库缺省的事物隔离级别都不会出现这种状况)1 N$ G7 X" U# U6 S/ u' z/ I

            read_committed:保证一个事务修改的数据提交后才能被另外一个事务读取。

                                               另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

            repeatable_read:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 3 [* {- F2 s. w+ |

            serializable:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

     

[plain] view plaincopyprint?
  1. 什么是脏读?(修改且未提交引起)  
  2. 例如:  
  3. 张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。  
  4. 随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。  

[plain] view plaincopyprint?
  1. 什么是不可重复读?(修改引起)  
  2. 例如:  
  3. 在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。与此同时,事务B把张三的工资改为8000,并提交了事务  
  4. 。随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。  
  5. (大部分数据库缺省的事物隔离级别都不会出现这种状况) .   

[plain] view plaincopyprint?
  1. 什么是幻读?(添加新记录引起)  
  2. 例如:  
  3. A目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。  
  4. 这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。  
  5. 大部分数据库缺省的事物隔离级别都会出现这种状况,此种事物隔离级别将带来表级锁)   

说明 :

Oracle数据库缺省的事物隔离级别已经保证了避免脏读和不可重复读。但可能会幻读,避免幻读需要加表级锁,Oracle缺省行级锁。

在基于Spring的事物配置中一定要慎重使用ISOLATION_SERIALIZABLE的事物隔离级别。这种配置会使用表级锁,对性能影响巨大。

一般没有特殊需要的话,配置为使用数据库缺省的事物隔离级别便可。

0 0
原创粉丝点击