zoukankan      html  css  js  c++  java
  • Spring使用注解进行事务管理

    一、在spring配置文件中加入命名空间

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">

    二、spring配置文件

        <!-- 事务管理器 -->
        <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--  数据源 源自于mybatis,也就是看dao.xml-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!-- 注解方式配置事务 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>

    三、类或接口的顶部加注解

    1.设置某个方法使用事务

    在调用的方法上加上@Transactional注解(必须为public方法才行,不要捕捉异常,要让异常自动抛出,否则不能进行事务回滚。方法要写在服务层中在controller中无效)。

    public class RoleServiceImpl implements RoleService {
        @Autowired
        RoleDao daoImpl;
    
        @Transactional    // 设置某个方法使用事务
        public int add(Role role) {
             
        }
    }

    2.设置某个类的所有方法都使用事务

    @Service
    @Transactional    // 类中所有方法都使用事务
    public class RoleServiceImpl implements RoleService {
        @Autowired
        RoleDao daoImpl;
    
        @Override
        public int add(Role role) {
            return daoImpl.add(role);
        }
    
        @Override
        @Transactional(propagation = Propagation.NOT_SUPPORTED)  // 不使用事务
        public List<Role> queryList() {
            return daoImpl.queryList();
        }
    }

    配置完成后可以在IDEA中看到,在spring配置文件左侧出现了一个m标识,点击可以跳转至配置事务的方法位置。

    四、测试

     如果没有使用事务,先添加角色,再人为制造一个异常。程序报异常后,数据库中任然插入了数据。

    使用食物后,出现异常后,数据库就会回滚,不会插入数据。

        @Override
        @Transactional
        public int add(Role role) {
            int affectRows = daoImpl.add(role);    // 添加角色
            
            int arr[] = {};
            arr[10] = 0;
            return affectRows;
        }

    现在有一个需求,我的MySQL数据库主键(int类型)是自动增长,每次插入失败主键增长了但没有插入成功,下一次加入成功后会造成数据的主键不连续。目前上述事务处理方式并不能解决这个需求。

    参考:

  • 相关阅读:
    【转】IOS开发:[1]Xcode5界面入门
    【转】Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得
    特征选择
    EM算法
    算法之美--3.2.3 KMP算法
    算法之美--3.2.2 MP算法
    图像质量评价方法PSNR+SSIM&&评估指标SROCC,PLCC
    C/C++二进制读写png文件
    大津法---OTSU算法
    一些优秀的面试笔试总结
  • 原文地址:https://www.cnblogs.com/trnanks/p/11384623.html
Copyright © 2011-2022 走看看