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日

相关文章

  • Java输入/输出流体系详解

    Java输入/输出流体系详解 引言 Java的输入/输出流是Java程序中使用频率很高的部分,从文件IO到网络IO,从字节流到字符流,从节点流到处理流,Java的IO体系都非常的强大和灵活。许多初学者在学习Java IO时经常会对Java IO体系的各个部分感到困惑和无从下手。本篇攻略就是希望能够帮助读者理解Java IO体系的各个方面,掌握Java输入/输…

    Java 2023年5月26日
    00
  • 一篇文章总结Java虚拟机内存区域模型

    以下是“一篇文章总结Java虚拟机内存区域模型”的完整攻略: 什么是Java虚拟机内存区域模型? Java虚拟机内存区域模型是指Java虚拟机在运行Java程序时所管理的内存区域划分。在Java虚拟机中,内存被划分为了5个不同的区域,每个区域有不同的功能,用于存储不同类型的数据。 Java虚拟机内存区域模型的五个区域 Java虚拟机将内存划分为以下5个区域:…

    Java 2023年5月26日
    00
  • 用JSP编写文件上传

    以下是使用JSP编写文件上传的完整攻略。 1. HTML表单 首先,我们需要在HTML文件中创建一个表单控件,让用户选择需要上传的文件并提交表单。代码如下: <form action="upload.jsp" method="post" enctype="multipart/form-data&quot…

    Java 2023年6月15日
    00
  • Java Swing编写一个简单的计算器软件

    Java Swing是一个强大的GUI工具包,用于编写基于Java的图形界面。下面是编写一个简单的计算器软件的完整攻略: 1.设计图形界面 首先,需要设计图形界面,包括按钮、文本框和标签等控件。可以使用Eclipse或NetBeans等IDE工具来快速创建Swing应用程序。 import java.awt.BorderLayout; import java…

    Java 2023年5月19日
    00
  • 实例分析java对象的序列化和反序列化

    Java 对象的序列化和反序列化是 Java 编程中的一项重要技术。序列化和反序列化可以将 Java 对象在网络传输或存储时转化为二进制数据流,并在需要时将其重新生成为 Java 对象。本文将详细讲解序列化和反序列化的基本概念、实现基础、序列化和反序列化的示例应用等内容,以便读者可以深刻理解和掌握这一技术。 什么是序列化与反序列化? 序列化是指将 Java …

    Java 2023年5月26日
    00
  • java学生信息管理系统源代码

    “Java学生信息管理系统源代码”攻略 Java学生信息管理系统是一个管理学生信息的应用程序,其源代码是由Java语言编写的。下面是一个详细的攻略,帮助您使用Java学生信息管理系统源代码。 步骤一:下载源代码 下载Java学生信息管理系统源代码。通常情况下,下载链接会提供在GitHub/GitLab上。 步骤二:下载和安装Java运行时环境 Java学生信…

    Java 2023年5月23日
    00
  • Java实现ATM取款机程序

    下面我将为您详细讲解Java实现ATM取款机程序的完整攻略。整个过程可以分为三部分:1.创建账户;2.登录账户;3.执行取款操作。 1. 创建账户 首先,我们需要定义一个Account类,包括属性:账号、密码、余额等。代码如下: public class Account { private String accountNumber; // 账号 privat…

    Java 2023年5月23日
    00
  • Spring Data JDBC介绍及实现代码

    Spring Data JDBC 是 Spring Framework 的一个子项目,它通过简化数据持久化操作来降低开发人员的工作量。Spring Data JDBC 不同于其他的 ORM 框架,它并不需要实体类与表间的映射,而是基于传统的 JDBC 封装来进行操作,并且支持 SQL 和存储过程的调用。 Spring Data JDBC 的使用包含以下几个步…

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