Spring 声明式事务

版权声明:未经作者允许,禁止私自转载! https://blog.csdn.net/qq_42726314/article/details/83070563

事务传播机制

propagation:事务传播机制有如下几种:

REQUIRED:默认值,表示如果存在一个事务,则支持当前事务;如果没有事务,则开启一个新事务。

REQUIRES_NEW:表示总是开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起,开启新事务执行该方法。

MANDATORY:表示如果存在一个事务,则支持当前事务;如果当前没有一个活动的事务,则抛出异常。

NESTED:表示如果当前存在一个活动的事务,则创建一个事务作为当前事务的嵌套事务运行;如果没有当前事务,该取值与REQUIRED相同。

SUPPORTS:表示如果存在一个事务,则支持当前事务;如果当前没有事务,则按非事务方法执行。

NOT_SUPPORTED:表示总是以非事务方式执行,如果一个事务已经存在,则将这个存在的事务挂起,然后执行该方法。

NEBER:表示总是以非事务方式执行,如果当前存在一个活动的事务,则抛出异常。

事务隔离等级

isolation:事务隔离等级,即当前事务和其他事务的隔离程度,在并发事务处理的情况下需要考虑它的设置。

DEFAULT:默认值,表示使用数据库默认的事务隔离级别。

READ_UNCOMMITTED:未提交读。

READ_COMMITTED:提交读。

REPEATABLE_READ:可重复读。

SEROALIZABLE:串行读。

timeout:事务超时时间。

允许事务运行的最长时间,以秒为单位,超过指定的时间自动回滚,防止事务执行时间过长而影响系统性能。该属性需要底层的实现支持。默认值:-1,表示不超时。

read-only:事务超时时间,允许是否为只读,默认值:false。

对于只用于查询的功能事务,设置为true,能提高事务处理的性能。

rollback-for:设定能够触发回滚的异常类型。Spring 默认只在抛出 Runtime Exception 才标识事务回滚。

可以通过全限定类名自行指定需要回滚事务的异常,多个类名用英文逗号隔开。

no-rollback-for:设定不触发回滚的异常。Spring 默认 checked Exception 不会触发事务回滚。

可以通过全限定类名自行指定不需回滚事务的异常,多个类名用英文逗号隔开,设置完事务规则,最后还要定义切面,将事务规则应用到指定的方法上。

一、在spring配置文件配置事务

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

<!-- 配置事务传播特性 -->
<tx:advice id="tAdvice" transaction-manager="txManager">
    <tx:attributes>
	<!-- 事务的传播特性 -->
	<!--SUPPORTS 支持当前事务,如果当前没有事务,就使用无事务 -->
	<!--REQUIRED 支持当前事务,如果没有事务则新建事务,默认值-->
	<!--REQUIRES_NEW 如果有当前事务,则挂起当前事务,新建新事务,反之,直接新建事务-->
	<!--MANDATORY 支持当前事务,如果没有事务,则抛出异常-->
	<!--timeout 事务超时时间 默认值是-1,-1表示不超时,以秒为单位-->
	<!--read-only 事务是否只读,默认值是false,-->

	<tx:method name="find*" propagation="SUPPORTS"/>
	<tx:method name="get*" propagation="SUPPORTS"/>
	<tx:method name="add*"/>
	<tx:method name="del*"/>
	<tx:method name="upd*"/>
	<tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="Transactional" expression="execution(* seriver.*.*(..))"/>
    <aop:advisor advice-ref="tAdvice" pointcut-ref="Transactional"/>
</aop:config>

二、使用注解方式实现事务:

spring配置文件添加如下代码:

<!-- 定义事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 将事务管理器交予spring
        * transaction-manager 配置事务管理器
        * proxy-target-class
            true : 底层强制使用cglib 代理
    -->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

1、业务逻辑实现类上 添加@Transactional 注解

2、方法体上 添加@Transactional 注解,这个权重会比上一种大。

默认的@Transactional设置:

事务传播特性是:PROPAGATION_REQUIRED

事务隔离级别是:ISOLATION_DEFAULT

事务是读/写

Runtime Exception 触发回滚,checked Exception 不触发事务回滚。

猜你喜欢

转载自blog.csdn.net/qq_42726314/article/details/83070563