Spring声明式事务配置
Spring声明式事务配置
一、事务管理的目的
事务管理是为了保证数据的完整性和一致性
二、事务的特性
1、原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用
2、一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中
3、隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
4、持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中
三、Spring中事务的实现方式
1.编程式事务
需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法
2.声明式事务
Spring中通过Spring AOP实现声明式事务管理
四、Spring中事务管理器
Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为JDBC、Hibernate等都提供了对应的事务管理器
1.JDBC事务
<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.通知声明式地管理事务并结合AOP实现事务的织入
<!--结合AOP实现事务的织入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给哪些方法配置事务-->
<!--配置事务的传播特性-->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事务切入-->
<!--把事务切入点和事务属性关联起来 -->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.hx.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
五、Spring事务的传播特性
①REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行,默认传播行为
②REQUIRED_NEW:当前方法必须启动新事务,并在自己的事务内运行,如果有事务正在运行,则将它挂起
③SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则可以不运行在事务中
④NOT_SUPPORTED:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
⑤MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就会抛出异常
⑥NEVER:当前方法不应该运行在事务中,如果有运行的事务,就抛出异常
⑦NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样
六、Spring事务隔离级别
spring中事务的隔离级别可以通过一下隔离属性指定
①DEFAULT:使用底层数据库的默认隔离级别,大部分数据库,默认隔离级别都是READ_COMMITED
②READ_COMMITED:只允许事务读取已经被其他事务提交的更改,可以避免脏读,但不可重复读和幻读问题仍然可能出现
③READ_UNCOMMITED:允许事务读取未被其他事务提交的更改。脏读,不可重复读,幻读都可能会出现
④REPEATABLE_READ:确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读的问题依然存在
⑤SERIALIZABLE:确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新,删除。所有的并发问题都能避免,但是性能比较低。
七、事务的回滚规则
默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚
八、使用注解声明式管理事务
@Transactional
为了将方法定义为支持事务处理,可以在方法上添加@Transactional注解。根据Spring AOP基于代理机制,只能标注公有方法,如果在类上标注@Transactional注解,那么这个类中所有公有方法都会被定义为支持事务。
步骤
1.配置事务管理
<!--配置声明式事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.在方法上加上@Transactional注解即可