Spring如何实现管理事务

 更新时间:2024年11月16日 08:49:25   作者:赚够壹仟万  
Spring通过编程式事务和声明式事务管理来控制事务的边界和行为,声明式事务管理通过@Transactional注解实现,提供了丰富的配置选项来控制事务的行为,如传播行为、隔离级别、超时时间和回滚规则

spring通过编程式事务和声明式事务管理来控制事务的边界和行为。

1. 事务管理器

Spring 通过事务管理器(Transaction Manager)来管理事务。不同的持久化技术(如 JDBC、JPA、Hibernate)对应不同的事务管理器,例如:

  • DataSourceTransactionManager:用于管理 JDBC 事务。
  • JpaTransactionManager:用于管理 JPA 事务。
  • HibernateTransactionManager:用于管理 Hibernate 事务。

事务管理器是 Spring 事务管理的核心,它负责处理事务的开始、提交和回滚。

2. 编程式事务管理

编程式事务管理是指在代码中显式地管理事务,通常使用 TransactionTemplate 或者底层的 PlatformTransactionManager

使用 TransactionTemplate

@Autowired
private TransactionTemplate transactionTemplate;

public void someMethod() {
    transactionTemplate.execute(status -> {
        // 执行业务逻辑
        // status.setRollbackOnly(); // 回滚事务
        return null;
    });
}

使用 PlatformTransactionManager

@Autowired
private PlatformTransactionManager transactionManager;

public void someMethod() {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(def);

    try {
        // 执行业务逻辑
        transactionManager.commit(status); // 提交事务
    } catch (Exception e) {
        transactionManager.rollback(status); // 回滚事务
    }
}

3. 声明式事务管理

声明式事务管理是通过 AOP(面向切面编程)和注解来管理事务,通常使用 @Transactional 注解。

这种方式更加简洁和方便,推荐使用。

使用 @Transactional 注解

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void someMethod() {
        // 执行业务逻辑
    }
}

@Transactional 注解可以应用于类或方法上,它的主要属性包括:

  • propagation:事务的传播行为,定义事务如何传播。常用的传播行为包括:

    • REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。
    • REQUIRES_NEW:总是创建一个新事务,如果当前存在事务,则挂起当前事务。
    • SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
    • NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则挂起当前事务。
    • MANDATORY:必须在事务中执行,如果当前没有事务,则抛出异常。
    • NEVER:必须在非事务中执行,如果当前存在事务,则抛出异常。
    • NESTED:如果当前存在事务,则创建一个嵌套事务;如果当前没有事务,则创建一个新事务。
  • isolation:事务的隔离级别,定义一个事务可以受到其他事务影响的程度。常用的隔离级别包括:

    • DEFAULT(默认):使用底层数据库的默认隔离级别。
    • READ_UNCOMMITTED:最低的隔离级别,允许脏读。
    • READ_COMMITTED:允许不可重复读,防止脏读。
    • REPEATABLE_READ:允许幻读,防止脏读和不可重复读。
    • SERIALIZABLE:最高的隔离级别,防止脏读、不可重复读和幻读。
  • timeout:事务超时时间,以秒为单位。默认值是 -1,表示没有超时限制。

  • readOnly:是否为只读事务。默认值是 false。只读事务通常用于查询操作,可以对某些数据库优化。

  • rollbackFor:指定哪些异常会导致事务回滚。例如:rollbackFor = RuntimeException.class

  • noRollbackFor:指定哪些异常不会导致事务回滚。例如:noRollbackFor = IllegalArgumentException.class

4. 事务传播和隔离级别

事务传播和隔离级别是 Spring 事务管理的重要概念。

  • 事务传播(Propagation):定义了事务方法被调用时事务的传播行为。例如,当前方法是否要在一个事务中运行,是否要加入现有的事务,或者是否要开启一个新的事务。
  • 隔离级别(Isolation):定义了一个事务可以看到其他事务对数据的影响程度。常见的隔离级别包括:READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE

示例:配置和使用事务

配置 Spring 事务管理

在 Spring Boot 中,只需要在主类或者配置类中添加 @EnableTransactionManagement 注解:

import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class AppConfig {
    // 配置数据源和事务管理器等
}

使用 @Transactional 注解

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void createUser(User user) {
        // 创建用户的业务逻辑
    }
}

总结

Spring 的事务管理机制通过编程式事务管理和声明式事务管理两种方式提供了灵活的事务控制。

声明式事务管理是最常用的方式,通过 @Transactional 注解,可以方便地控制事务的传播行为、隔离级别、超时时间和回滚规则。

Spring 事务管理机制的强大和灵活性,使得开发者可以轻松地处理复杂的事务场景,确保数据的一致性和完整性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 微信企业号验证/发送/接收消息

    微信企业号验证/发送/接收消息

    这篇文章主要介绍了微信企业号验证/发送/接收消息的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Springboot 手动分页查询分批批量插入数据的实现流程

    Springboot 手动分页查询分批批量插入数据的实现流程

    这篇文章主要介绍了Springboot 手动分页查询分批批量插入数据的实现流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Intellij IDEA命令行执行java无法加载主类解决方案

    Intellij IDEA命令行执行java无法加载主类解决方案

    这篇文章主要介绍了Intellij IDEA命令行执行java无法加载主类解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java 实现RSA非对称加密算法

    Java 实现RSA非对称加密算法

    RSA解决了对称加密的一个不足,比如AES算法加密和解密时使用的是同一个秘钥,因此这个秘钥不能公开,因此对于需要公开秘钥的场合,我们需要在加密和解密过程中使用不同的秘钥,加密使用的公钥可以公开,解密使用的私钥要保密,这就是非对称加密的好处。 
    2021-06-06
  • 详解spring mvc4使用及json 日期转换解决方案

    详解spring mvc4使用及json 日期转换解决方案

    本篇文章主要介绍了spring mvc4使用及json 日期转换解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Struts2实现自定义拦截器的三种方式详解

    Struts2实现自定义拦截器的三种方式详解

    这篇文章主要介绍了Struts2实现自定义拦截器的三种方式详解,一些与系统逻辑相关的通用功能如权限的控制和用户登录控制等,需要通过自定义拦截器实现,本节将详细讲解如何自定义拦截器,需要的朋友可以参考下
    2023-07-07
  • Spring mvc AJAX技术实现原理解析

    Spring mvc AJAX技术实现原理解析

    这篇文章主要介绍了Spring mvc AJAX技术实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java设计者模式简单工厂模式解析

    Java设计者模式简单工厂模式解析

    这篇文章主要介绍了Java设计者模式简单工厂模式解析,介绍了其简介,实例以及优缺点分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java正则验证IP的方法实例分析【测试可用】

    Java正则验证IP的方法实例分析【测试可用】

    这篇文章主要介绍了Java正则验证IP的方法,结合实例形式对比分析了网上常见的几种针对IP的正则验证方法,最终给出了一个比较靠谱的IP正则验证表达式,需要的朋友可以参考下
    2017-08-08
  • java并发无锁多线程单线程示例详解

    java并发无锁多线程单线程示例详解

    这篇文章主要为大家介绍了java并发无锁多线程单线程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论