• 浅谈Spring中的事务【Transactional】


    当谈到 Spring 中的事务管理时,我们必须理解它的核心概念、工作原理以及常见的用法。本文将详细解释 Spring 中事务的基础知识,包括事务管理的原理、事务的隔离级别、传播行为、注解和编程式事务管理等方面。在理解这些知识后,你将能够更好地设计和管理应用程序中的事务。

    1. 什么是事务?

    事务是一组操作,要么全部成功执行,要么全部失败回滚,以确保数据的一致性和完整性。在数据库中,事务通常用于一组数据库操作,例如插入、更新、删除等。

    2. Spring 事务管理的原理

    Spring 的事务管理建立在 AOP(面向切面编程)和底层事务 API(如 JDBC、Hibernate、JPA 等)之上。Spring 提供了一个事务管理器接口 PlatformTransactionManager,用于管理事务的开始、提交和回滚。

    3. Spring 中的事务隔离级别

    事务隔离级别定义了事务之间的可见性和并发行为。Spring 支持数据库标准的四种隔离级别:

    • DEFAULT:数据库默认的隔离级别。
    • READ_UNCOMMITTED:允许事务读取未提交的数据。
    • READ_COMMITTED:只允许事务读取已提交的数据,防止脏读。
    • REPEATABLE_READ:保证在事务执行期间查询的数据保持一致,防止不可重复读。
    • SERIALIZABLE:最高的隔离级别,通过强制事务串行执行来防止幻读。

    4. Spring 中的事务传播行为

    事务传播行为定义了方法如何参与现有事务或如何创建新事务。Spring 定义了七种事务传播行为:

    • REQUIRED:如果当前存在事务,则加入该事务;如果不存在,则创建新事务。
    • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
    • MANDATORY:强制要求存在当前事务,如果不存在,则抛出异常。
    • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则将当前事务挂起。
    • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
    • NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
    • NESTED:如果当前存在事务,则在嵌套事务内执行,否则创建一个新事务。

    5. Spring 中的事务管理方式

    Spring 提供了两种方式来管理事务:注解和编程式事务管理。

    • 注解式事务管理:通过在方法上添加 @Transactional 注解来声明事务。
    • 编程式事务管理:通过编程方式调用事务管理器的 API 来管理事务,比较灵活但也更加繁琐。

    6. 注解式事务管理示例

    @Service
    @Transactional
    public class UserService {
        
        @Autowired
        private UserRepository userRepository;
    
        public void updateUser(User user) {
            // update user logic
            userRepository.save(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这个例子中,updateUser() 方法通过 @Transactional 注解声明为一个事务方法,当方法执行时,会自动开启、提交或回滚事务。

    7. 编程式事务管理示例

    @Service
    public class UserService {
        
        @Autowired
        private PlatformTransactionManager transactionManager;
    
        @Autowired
        private TransactionDefinition transactionDefinition;
    
        @Autowired
        private UserRepository userRepository;
    
        public void updateUser(User user) {
            TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
            try {
                // update user logic
                userRepository.save(user);
                transactionManager.commit(status);
            } catch (Exception e) {
                transactionManager.rollback(status);
                throw e;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这个例子中,updateUser() 方法通过编程方式调用事务管理器的 API 来手动管理事务的开始、提交和回滚。

    结语

    Spring 的事务管理为我们提供了一种轻松、灵活且可扩展的方式来管理事务。通过理解事务的基础知识、原理和常见用法,我们可以更好地设计和管理应用程序中的事务,确保数据的一致性和完整性。

  • 相关阅读:
    Ubuntu服务器的GitLab部署
    fcitx5 中文输入在 chrome/vscode 等应用中的问题及解决
    【Playwright+Python】系列教程(五)元素定位
    基于随机森林实现特征选择降维及回归预测(Matlab代码实现)
    2.1万字,30张图详解操作系统常见面试题(收藏版)
    从零开始做好个人记账
    2022护眼产品展,北京眼健康展,眼科医学展,近视矫正设备展
    CN考研真题知识点二轮归纳(5)
    lombok ---- pojo简洁之道
    对抗生成网络(GAN)中的损失函数
  • 原文地址:https://blog.csdn.net/hello_boyu/article/details/138172078