SpringBoot超详细讲解事务管理

SpringBoot超详细讲解事务管理

什么是事务管理?

在数据库中,事务是一组要么全部执行、要么全部不执行的操作序列。如果在事务中任何一个操作失败,整个事务都应该失败并回滚到事务开始状态。

事务管理就是保证在数据库操作中,一组操作要么全部完成,要么全部不完成的机制。

Spring中的事务管理

Spring框架中提供了多种方式进行事务管理,包括声明式事务管理和编程式事务管理。

声明式事务管理

声明式事务管理是根据注解或者配置文件来配置事务,使得在进行数据库操作时自动开启、提交或者回滚事务。一般使用在Service层。

在SpringBoot中,需要在启动类上添加@EnableTransactionManagement注解来启动声明式事务管理。

@SpringBootApplication
@EnableTransactionManagement
public class SpringBootDemoApplication {
    // ...
}

注解方式

在方法上或类上使用注解的方式来配置事务:

  • @Transactional:配置方法使用事务
  • 可以指定事务的传播行为、隔离级别、是否只读以及回滚条件等属性
  • @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, rollbackFor = Exception.class)
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void transfer(String from, String to, Integer money) {
        // TODO: transfer money from account `from` to account `to`
        // ...
    }
}

配置文件方式

在配置文件中配置事务的方式:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.example.service.*.*(..))" id="serviceMethods" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>

编程式事务管理

编程式事务管理是通过代码方式控制事务的开启、提交和回滚。一般使用在DAO层。

public interface UserDao {
    void transfer(String from, String to, Integer money);
}

public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void transfer(String from, String to, Integer money) {
        try {
            // 开启事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            // TODO: transfer money from account `from` to account `to`
            // ...
            // 提交事务
            TransactionAspectSupport.currentTransactionStatus().flush();
        } catch (Exception e) {
            // 回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}

示例

声明式事务管理

假设有一个转账服务,需要转账金额并在数据库中记录转账日志。

@Service
public class AccountService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void transfer(String from, String to, Integer money) {
        jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?", money, from);
        jdbcTemplate.update("INSERT INTO log (account_id, money) VALUES (?, ?)", from, money);
        jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?", money, to);
        jdbcTemplate.update("INSERT INTO log (account_id, money) VALUES (?, ?)", to, money);
    }
}

编程式事务管理

以SpringBoot和Mybatis为例实现编程式事务管理。

@Service
public class AccountService {
    @Autowired
    private AccountDao accountDao;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void transfer(String from, String to, Integer money) {
        accountDao.transfer(from, money * -1);
        accountDao.transfer(to, money);
    }
}

@Repository
public class AccountDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void transfer(String id, Integer money) {
        try {
            // 开启事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

            jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?", money, id);

            // 提交事务
            TransactionAspectSupport.currentTransactionStatus().flush();
        } catch (Exception e) {
            // 回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot超详细讲解事务管理 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • springMVC向Controller传值出现中文乱码的解决方案

    针对springMVC向Controller传值出现中文乱码的问题,可以采取以下步骤: 1. 在web.xml文件中添加过滤器 在web.xml文件中添加如下过滤器: <filter> <filter-name>Character Encoding Filter</filter-name> <filter-class…

    Java 2023年5月20日
    00
  • java去除数组重复元素的四种方法

    关于“java去除数组重复元素的四种方法”的完整攻略,我给您详细讲解。 一、方法一:使用Set去重 使用Set去重是一种简单而高效的方法,它利用Set集合的特点,将重复元素去除,最终得到一个无序不重复的数组。具体步骤如下: 将数组转换为List集合。 创建一个新的HashSet集合。 将List中的元素依次加入HashSet中。 将HashSet转换为数组。…

    Java 2023年5月26日
    00
  • 讲解ssm框架整合(最通俗易懂)

    下面是详细的“讲解ssm框架整合(最通俗易懂)”攻略,希望对你有帮助。 SSM框架整合 介绍 SSM框架整合是一种结合了Spring、SpringMVC和MyBatis的Web开发框架。其中,Spring用来管理和注入Bean,SpringMVC用来实现Web应用程序的MVC模式,而MyBatis则用来将Java对象映射到数据库表中的记录。 整合步骤 下面是…

    Java 2023年5月20日
    00
  • Spring Security 过滤器注册脉络梳理

    下面是Spring Security 过滤器注册脉络梳理的完整攻略。 Spring Security 过滤器注册脉络梳理 在Spring Security中,过滤器的注册是非常重要的一项工作,它决定了Spring Security能否对请求进行拦截,并进行相应的安全控制。 过滤器链 Spring Security 采用了一条链式过滤器来完成安全控制,它是由一…

    Java 2023年5月20日
    00
  • Jsp+Servlet实现简单登录注册查询

    下面是详细的“Jsp+Servlet实现简单登录注册查询”的攻略: 一、前提要求:开发环境安装与配置 1. JDK和Tomcat环境安装 在开始之前,需要在电脑上安装JDK和Tomcat两个环境。 JDK下载安装地址:https://www.oracle.com/java/technologies/javase-downloads.html Tomcat下载…

    Java 2023年6月15日
    00
  • Java-IO流实验

    Java-IO流实验攻略 实验目的 通过本实验,学生应该了解和掌握基本的Java IO流的使用方法,包括文件输入/输出流、字符输入/输出流、缓冲输入/输出流和对象输入/输出流等,同时也能够学会如何合理地使用IO流来处理文件读写操作。 实验环境 Java 8及以上版本 Eclipse等Java IDE软件 实验步骤 1. 创建文件 首先需要创建一个用于测试的文…

    Java 2023年5月26日
    00
  • Java数组扩容实例代码

    下面我来为你详细讲解Java数组扩容实例代码的完整攻略。 1. 初探数组扩容 在Java中,数组是一种非常常用的数据结构,但是数组的长度是固定的,无法动态增长,这会限制数组的使用。为了解决这个问题,我们可以使用Java的数组扩容机制,实现数组的动态增长。 1.1 数组扩容原理 当数组不够用时,我们需要创建一个新的更大的数组来替换原来的数组。具体步骤为: 创建…

    Java 2023年5月23日
    00
  • Spring boot创建自定义starter的完整步骤

    Spring Boot创建自定义starter的完整步骤 在Spring Boot中,我们可以创建自定义starter来封装一些常用的功能,以便于在其他项目中重复使用。本文将详细讲解Spring Boot创建自定义starter的完整步骤,并提供两个示例。 1. 创建starter项目 以下是创建starter项目的基本流程: 在IDEA中创建一个Maven…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部