史上最全的spring里面之@Transactional原理解析

这篇具有很好参考价值的文章主要介绍了史上最全的spring里面之@Transactional原理解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、原理:
Spring框架中的@Transactional注解用于声明式事务管理,它允许开发者在方法级别控制事务的边界。具体原理如下:

代理机制: Spring通过AOP(面向切面编程)来实现事务管理。当一个类的方法上标注了@Transactional注解时,Spring不会直接创建这个类的实例,而是生成一个代理对象(通常是JDK动态代理或CGLIB代理)。这个代理对象包裹了原始目标对象,并在调用实际方法前后插入额外的逻辑。

事务拦截器: 在Spring的AOP体系中,会有一个针对@Transactional注解的拦截器,在执行被注解的方法前开启一个新的数据库事务(如果当前没有事务的话),并在方法执行后根据方法的执行情况决定是否提交或回滚事务。

事务管理器: Spring内部使用PlatformTransactionManager接口实现与具体的事务API交互,例如对于JDBC、Hibernate、JPA等数据访问技术,都有对应的事务管理器实现。事务管理器负责真正管理和执行事务操作。

事务传播行为: @Transactional注解还支持定义事务的传播行为,如REQUIRED、REQUIRES_NEW、SUPPORTS等,这些策略决定了在调用嵌套事务方法时如何处理事务边界。

异常检测: 当被注解的方法正常执行完毕且未抛出任何运行时异常或受检查异常时,Spring会自动提交事务;反之,若方法抛出了未捕获的异常,Spring将根据配置回滚事务。

事务超时、只读和隔离级别设置: @Transactional还可以设置事务的超时时间、标记事务为只读以及指定事务的隔离级别。

总的来说,@Transactional注解提供了一种透明化的事务管理方式,使得开发者无需关注底层数据库连接和事务细节,只需在业务代码层面上通过注解来声明事务边界即可。

二、开发者使用

@Transactional注解在Spring框架中主要用于声明式事务管理,它允许开发人员在服务层方法级别上控制数据库事务的边界。主要作用包括:

事务开启与提交:当方法执行时,如果该方法被@Transactional注解,则Spring会自动开启一个数据库事务,并在方法正常完成(没有抛出未捕获异常)的情况下提交事务。

事务回滚:如果在方法执行过程中抛出了未检查异常(继承自RuntimeException或声明了@Transactional(rollbackFor=…)的受检查异常),Spring将自动触发事务回滚,确保数据的一致性。

事务传播行为:

REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,也继续执行,不创建新事务。
MANDATORY:必须在一个已存在的事务中运行,否则抛出异常。
REQUIRES_NEW:总是新建一个事务,如果当前存在事务,则挂起当前事务。
NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则暂停当前事务。
NEVER:必须不在事务中运行,如果当前存在事务,则抛出异常。
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就像REQUIRED一样。
其他属性设置:还可以通过@Transactional注解来指定事务超时时间、是否为只读事务以及隔离级别等属性。

这些策略使得开发者能够灵活地定义不同业务场景下的事务处理规则,保证了数据操作的原子性和一致性。

三、举例实操
以下是一个@Transactional注解在Spring框架中使用的基本示例

一个`@Transactional`注解在Spring框架中使用的基本示例:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 使用@Transactional注解声明该方法需要在一个事务中执行
    @Transactional
    public void createUserAndAccount(String username, String password) {
        try {
            // 创建用户
            String createUserSql = "INSERT INTO users (username) VALUES (?)";
            jdbcTemplate.update(createUserSql, username);

            // 创建账户,假设这里有可能抛出异常
            String createAccountSql = "INSERT INTO accounts (username, password) VALUES (?, ?)";
            jdbcTemplate.update(createAccountSql, username, password);
        } catch (Exception e) {
            // 如果在创建账户过程中出现任何异常,由于有@Transactional注解,整个方法将回滚,
            // 用户和账户都不会被真正插入到数据库中
            throw new RuntimeException("Failed to create user and account", e);
        }
    }
}

在这个例子中,createUserAndAccount方法上添加了@Transactional注解,意味着这两个SQL操作将会作为一个原子事务处理。如果在执行过程中任何一个SQL语句失败(例如,由于违反了数据库约束),那么两个SQL操作都将被回滚,保证了数据的一致性。文章来源地址https://www.toymoban.com/news/detail-853175.html


到了这里,关于史上最全的spring里面之@Transactional原理解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring-transaction源码分析(3)Transactional事务失效原因

    在Transactional方法中使用this方式调用另一个Transactional方法时,拦截器无法拦截到被调用方法,严重时会使事务失效。 类似以下代码: 正常情况下,执行到\\\"继续插入数据\\\"时会抛出一个\\\"rollback only\\\"的异常,然后事务回滚。 而现在的现象是: 三个操作都不会开启事务,出现异常

    2024年02月03日
    浏览(56)
  • Spring 声明式事务 @Transactional(基本使用)

            声明式事务的实现很简单,只需要在需要事务的⽅法上添加 @Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了 没有处理的异常会⾃动回滚事务.         废话不多说,直接看代码实现,

    2024年01月23日
    浏览(50)
  • 【spring(四)】Spring事务管理和@Transactional注解

    🌈键盘敲烂,年薪30万🌈 目录 Spring中的事务管理 问题抛出: 解决方案: @Transactional注解: rollbackFor属性: propagation属性: 应用: 📕总结 知识回顾: ❓什么是事务 事务是对数据操作的集合,它是数据操作的最小执行单位,也就是说,要么一个事务中操作全部执行完毕,

    2024年01月17日
    浏览(49)
  • Spring5学习随笔-事务属性详解(@Transactional)

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 事务是 保证业务操作完整性的一种数据库机制 事务的4特点:ACID A 原子性 C 一致性 I 隔离性 D 持久性 JDBC: Connection.setAutoCommit(false) Connect

    2024年02月05日
    浏览(40)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(31)
  • Spring 事务的使用、隔离级别、@Transactional的使用

            Spring事务是Spring框架提供的一种机制,用于管理应用程序中的数据库事务。         事务是一组数据库操作的执行单元,要么全部成功提交,要么全部失败回滚,保证数据的一致性和完整性。 Spring事务提供了声明式事务和编程式事务两种方式: 编程式事务:

    2024年02月15日
    浏览(46)
  • Spring @Transactional注解事务传播机制propagation参数说明

    在SpringBoot项目中,我们通常使用 @Transactional 去进行事务控制,而 @Transactional 注解中,有个比较关键的属性就是 propagation 。在一个 多事务 的环境中,一个事务方法调用另一个事务方法时,就会涉及到事务的传播行为,该属性用来控制一段代码经过多个 @Transactional 注解生效(

    2024年02月11日
    浏览(43)
  • Spring 声明式事务讲解,和 @Transactional注解的用法

    目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、@Transactional注解的用法 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型,可以帮助开发人员构建可扩展、模块

    2024年01月25日
    浏览(52)
  • Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

            关于 @Transactional 注解的基本使用,推荐看Spring 声明式事务 @Transactional(基本使用)         本篇博客主要学习 @Transactional 注解当中的三个常⻅属性:         1. rollbackFor:异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型         2. Iso

    2024年01月25日
    浏览(49)
  • spring动态代理失效,AOP失效,事务@Transactional失效原因

    事务基于@Transactional注解和AOP(动态代理) 对于基于接口动态代理的 AOP 事务增强来说,由于接口的方法都必然是 public 的,这就要求实现类的实现方法也必须是 public 的(不能是 protected、private 等),同时不能使用 static 的修饰符。所以,可以实施接口动态代理的方法只能是

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包