spirng事务中遇到的问题

Posted zjf1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spirng事务中遇到的问题相关的知识,希望对你有一定的参考价值。

spring配置事务传播特性为REQUIRED,即如果有就加入。如果是在业务中有记录日志等操作,用此特性,则发生回滚后日志也记录不上。

将记录日志的方法配置成REQUIRED_NEW,无论如何都会新开启一个事务,并将之前的事务挂起。这样如果之前的事务回滚,不会影响这个事务。

REQUIRED_NEW的方法不能和REQUIRED的方法在同一个类中,否则不生效(网上是这样说的,具体没测试)

例如:

事务切在a方法,a调用b方法(记录日志)。如果不单独设置事务,那么异常后a,b都回滚。

如果a方法设置事务REQUIRED,b方法设置事务REQUIRED_NEW,那么异常后a回滚,b不回滚。(b方法需要在另一个业务类中)

配置代码如下:

<!-- 配置事务特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="process*" propagation="REQUIRED"/>
<tx:method name="newSaveOrUpdate*" propagation="REQUIRES_NEW"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- 配置那些类的方法进行事务管理 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.ibm.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>

 

 

如果手动抛出异常,需要抛出runtimeException才能回滚。如果抛出exception则不会回滚。

以上是关于spirng事务中遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于项目中遇到的问题-- trycatch 手动回滚事务

python使用MySQLdb遇到的事务问题

Ldap遇到了事务管理问题

Java中数据库会遇到哪些问题?

PHP实现多进程模拟并发事务时遇到的问题

两小时上手Spring Boot (开发红包程序———通过JPA 连接Mysql ,事务等内容) 遇到的问题