ssm手动提交事务


开发中会遇到一种情况,在业务曾中需要对多个数据进行新增。比如用户新增的同时,还需要对用户角色表、用户详细信息表等进行新增操作。

目录:

不嫌麻烦,可以自己设置手动提交事务模式,具体说明如下:

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

返回顶部↑

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值