事务传播机制
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 不触发事务回滚。