Spring事务管理方式

如果不配置spring的事务,那么默认每次执行dao层方法即自动提交事务。

<!--配置事务管理器-->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--配置datasource-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置事务传播特性和 事务隔离级别-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--配置事务传播特性 method为方法名, propagation配置事务传播特性
             isolation="" 指定事务隔离级别-->
            <!-- name:指定切入点的方法名,匹配的方法才能够指定到事务传播特性和隔离级别-->
            <tx:method name="save*" propagation="REQUIRED"  isolation="READ_COMMITTED" />
            <tx:method name="insert*" propagation="REQUIRED" isolation="SERIALIZABLE"/>
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <!--查询操作 配置read-only=true,标识为只读事务。-->
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="select*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>

Spring事务管理方式有两种

1)    编程式事务:以java编码的方式来实现事务的管理。基本不使用。

2)    声明式事务:只需要申明配置事务的处理方式,spring会自动进行事务管理。

a.        事务管理器

b.       事务的传播特性:事务的传播特性用来定义事务中又存在事务的情况下,该如何来处理事务。(Service层方法调用service层方法时)

a)       Required:必须,必须有一个事务,如果没有,则会开启一个事务。如果有,则使用当前事务。(默认)

b)       Requireds_new:(需要自己的新的事务) 必须运行在自己的事务中,即使当前方法存在一个事务,也会新建一个自己的事务。执行本身事务时,会将外部事务挂起。

c)        Nested:(嵌套)可以多个事务嵌套在一起,内部事务不会影响外部事务,外部事务回滚,会影响到内部事务回滚。

d)       Mandtory: (必须有事务)要求必须有事务,没有事务就抛出异常。

e)       Never:(永不) 不支持事务,有事务就抛出异常。

f)        Supports:(支持) 如果 有事务和没有事务都支持。

g)       not_supported :(不支持事务),有事务存在,便不运行,直到事务提交后再执行。

c.        事务的隔离级别:

a)       READ_UNCOMMITTED:读未提交

b)       READ_COMMITTED:读已提交

c)        REPEATABLE_READ:可重复读

d)       SERIALIZABLE:串行化

e)       DEFAULT:按照数据库默认的隔离级别。(默认)

d.       事务AOP,将事务切入到对应的方法。

e.        以注解的形式配置

a)       在spring的配置文件中配置启用事务注解

<tx:annotation-driven/>

b)       在需要事务处理的类或方法上面添加事务注解

  @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)

相关推荐