Spring框架之事务控制学习

it2023-09-27  78

Spring框架之事务控制学习

声明式事务:

以前通过复杂的编程来编写一个事务,替换为只需要告诉Spring哪个方法是事务方法即可;Spring自动进行事务控制。

AOP的环绕通知可以去做

事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,进而借助Spring AOP框架实现声明式事务管理

Spring已经提供了事务管理器

这个事务管理器就可以在目标方法运行前后进行事务控制(事务切面)

快速为某个方法添加事务:

1、配置出这个事务管理器让它工作

基于注解的方式

<!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--控制数据源--> <property name="dataSource" ref="dataSource"/> </bean> <!--开启基于注解的事务控制模式--> <tx:annotation-driven transaction-manager="transactionManager"/> <!--在目标方法上加@Transactional注解-->

@Transactional注解

//事务的隔离级别;读未提交,读已提交,可重复读,串行化;根据业务特性调整 isolation-Isolation //事务的传播行为 //事务的传播+事务的行为,如果有多个事务进行嵌套运行,子事务是否要和大事务共用一个事务; //REQUIRED:如果有事务运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行; //REQUIRED_NEW:当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起; //SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中; //NOT_SUPPORTED:当前的方法不应该运行在事务中,如果有运行的事务,将它挂起; //MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常; //NEVER:当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常; //NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行; propagation-Propagation //哪些异常事务可以不会滚,默认是发生异常都回滚;可以让原来默认回滚的异常给它不回滚 noRollbackFor-Class[] //写全类名 noRollbackForClassName-String[] //哪些异常事务需要回滚,编译时异常是不回滚的,设置后会回滚,如文件不存在异常 rollbackFor-Class[] //写全类名 rollbackForClassName-String[] //设置事务为只读事务,可以进行事务优化;加快查询速度,不用管事务那一堆操作了 readOnly-boolean //超时,事务超出指定执行时长后自动终止并回滚 timeout-int

如果一个事务使用了REQUIRED,那么它事务的属性就来继承上级的事务,比如超时,只读之类的属性

REQUIRED:将之前事务用的connection传递给这个方法使用

REQUIRED_NEW:创建一个新的connection

本类方法的调用都只有一个事务

XML版的事务控制

<!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--控制数据源--> <property name="dataSource" ref="dataSource"/> </bean> <aop:config> <aop:pointcut id="pt" expression="execution(* com.xiaokaige.dao.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query" read-only="true" propagation="SUPPORTS"/> <tx:method name="get" read-only="true" propagation="SUPPORTS"/> <tx:method name="select" read-only="true" propagation="SUPPORTS"/> <tx:method name="find" read-only="true" propagation="SUPPORTS"/> <tx:method name="*" read-only="false" propagation="SUPPORTS"/> </tx:attributes> </tx:advice>

重要的用配置,不重要的用注解

最新回复(0)