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类型)是自动增长,每次插入失败主键增长了但没有插入成功,下一次加入成功后会造成数据的主键不连续。目前上述事务处理方式并不能解决这个需求。

    参考:

  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/trnanks/p/11384623.html
Copyright © 2011-2022 走看看