开发中会遇到一种情况,在业务曾中需要对多个数据进行新增。比如用户新增的同时,还需要对用户角色表、用户详细信息表等进行新增操作。
目录:
不嫌麻烦,可以自己设置手动提交事务模式,具体说明如下:
1.配置文件 applicationContext.xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 定义拦截器,用来指定事物属性,级别,和异常处理 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<!-- PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行;
PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常;
PROPAGATION_REQUIRED: 新建事务,如果当前有事务, 则挂起;
PROPAGATION_NOT_SUPPORTED:以非事务的方式执行,如果当前有事务, 则挂起;
PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常; +/-Exception</prop>
+ 表示异常出现时事物提交 - 表示异常出现时事务回滚 -->
<prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="query*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="del*"> PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="on*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
</props>
</property>
</bean>
<!-- 用来定义那些类需要采用事物管理 spring 事物的动态代理类 BeanNameAutoProxyCreator 根据类名自动代理,接受表达式 -->
<bean id="BeanProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<!-- 对类名以Service结尾的类进行代理 -->
<list>
<value>*Service*</value>
</list>
</property>
<!-- 对代理类进行加载拦截器(实现通知的过程) -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
2.业务层 *Service.java文件
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Autowired
private DataSourceTransactionManager transactionManager;
//1.获取事务定义
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
//2.设置事务隔离级别,开启新事务
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//3.获得事务状态
TransactionStatus status = transactionManager.getTransaction(def);
// 事务回滚
transactionManager.rollback(status);
// 事务提交
transactionManager.commit(status);
后来才发现自己给坑了自己。会在业务逻辑层直接try catch捕捉异常,控制层再捕捉一次Exception。
其实ssm里有很完善的事务管理机制,直接调用多个方法,不捕捉异常,当其中一个方法报错时,之前运行的事务亦会回滚。
实际上写代码时,前辈们都会推荐在控制层进行参数处理和捕捉异常,在业务层处理代码逻辑。
参考阅读:
https://blog.csdn.net/qq_33390789/article/details/70158242