V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rqxiao
V2EX  ›  Java

请问 spring 里的事务和数据库中的事务本质上是一个东西吗

  •  1
     
  •   rqxiao · 2021-03-24 09:15:01 +08:00 · 4510 次点击
    这是一个创建于 1372 天前的主题,其中的信息可能已经有所发展或是发生改变。

    spring 中的 @Transactional 和数据库中 START TRANSACTION; 其实是一个东西吗

    第 1 条附言  ·  2021-03-24 10:03:12 +08:00
    如果只 spring 事务只是在操作数据库的话
    24 条回复    2021-03-24 22:25:39 +08:00
    jorneyr
        1
    jorneyr  
       2021-03-24 09:19:17 +08:00
    是的,Spring 的 @Transactional 只是代码封装,让使用者更方便,没有发明新东西。
    RedBeanIce
        2
    RedBeanIce  
       2021-03-24 09:20:15 +08:00
    这个要等一个看过 Spring 相关源码的大佬来回答了。~

    数据库那部分我所理解的是开启一个事务,需要手动提交。
    ymmud
        3
    ymmud  
       2021-03-24 09:20:38 +08:00
    不全是,不局限于数据库事务
    blackkkk
        4
    blackkkk  
       2021-03-24 09:26:07 +08:00
    @Transactional 最终还是转换成数据库里面的开启事务,异常则调用 rollback 回滚。当然除了简单的开启关闭事物,过程中还可以做事务传播的相关操作,并不完全等于数据库里面简单的开启关闭事务。
    xkzhangsan
        5
    xkzhangsan  
       2021-03-24 09:31:20 +08:00 via Android
    本质上是一个,spring 是基于 AOP 实现的,自动提交,没有数据库的灵活。
    cheng6563
        6
    cheng6563  
       2021-03-24 09:31:49 +08:00
    Spring 调用 jdbc,jdbc 再调用数据库事务。
    timethinker
        7
    timethinker  
       2021-03-24 09:32:22 +08:00   ❤️ 1
    声明式事务实现原理就是利用 AOP 代理拦截目标方法,在目标方法调用前后实施事务外围工作。

    感兴趣的可以看一下 org.springframework.transaction.interceptor.TransactionInterceptor
    myBatis
        8
    myBatis  
       2021-03-24 09:33:13 +08:00
    事务指的是一组逻辑操作,你甚至可以把一组 if else 称之为事务。单就事务本身的话,二者含义是一样的。
    anonydmer
        9
    anonydmer  
       2021-03-24 09:33:42 +08:00   ❤️ 3
    不全是:

    spring 的事务包含传播属性( Propagation )和隔离级别( Isolation )两部分内容,隔离级别是数据库层面的;传播属性是 Java 中的概念,最早产生于 JTA,不过 spring 做了一些扩展;

    从 @Transactional 的 api 文档中也可以看到,它有几个设置项,其中就包括 Propagation Type 和 Isolation Level
    securityCoding
        10
    securityCoding  
       2021-03-24 09:40:10 +08:00 via Android
    隔离级别就是一个东西,传播机制是 spring 自己定义的代码事务行为。
    yeqizhang
        11
    yeqizhang  
       2021-03-24 09:45:08 +08:00 via Android
    普通的就是说数据库事务,分布式事务涉及到业务,从业务代码上写的逻辑……spring 主要是声明式操作事务,事务传播就是什么时候开启一个事务……事务的实现都是数据库层面的事情,事务隔离级别也是,spring 多了个默认级别的配置。
    各位大佬,我个人的理解有没有问题?错了请轻喷[狗头]
    anonydmer
        12
    anonydmer  
       2021-03-24 09:50:11 +08:00
    而且,把 spring 事务理解成简单的数据库事务也是不恰当的; spring 支持多种事务管理,包括 JDBC, JPA, JTA 和 JMS 这些;像 JMS 就不是指数据库场景。

    spring 的事务管理是 spring 之所以强大的一个很核心的原因,功能是很丰富和强大的;只不过大部分人只涉及到了很少的场景比如本地事务
    hantsy
        13
    hantsy  
       2021-03-24 10:07:58 +08:00   ❤️ 1
    @rqxiao 大部分情况下,Spring 中使用事务就是使用 Local Transaction,也就是数据库事务。不过 Spring 中的 TransactionManager 也可以使用其他事务,比如 JTA 。

    @anonydmer JTA,Java EE/Jakarta EE 中分布式事务标准。在 Spring 使用,要配置外部专用的事务方案(嵌入的,或者专有的事务服务器,或者部署环境是标准的 Java EE/Jakarta EE 服务器),JTA 才是真正事务管理的最好诠释。国内情况就我所知,很多写了 5 年程序的人,没有用过 JTA 。

    使用外部方案 atomikos 配置 JTA 的例子: https://github.com/hantsy/spring-playground/blob/master/multi-ds-jms-jta
    使用 Java EE/JakartaEE 标准容器获得 JTA 事务支持: https://github.com/hantsy/spring-playground/tree/master/jakartaee-container-managed
    YoRuo
        14
    YoRuo  
       2021-03-24 10:36:54 +08:00
    TransactionAspectSupport invokeWithinTransaction 看一下就明白了
    hehe12980
        15
    hehe12980  
       2021-03-24 10:44:57 +08:00
    @hantsy 不用 JTA 很正常,大型分布式系统应该不会考虑使用二阶段三阶段提交这种产物,太影响并发,基本都是做补偿机制,写了 5 年程序的人为啥要用 JTA,没有必然关系把
    hantsy
        16
    hantsy  
       2021-03-24 10:50:50 +08:00
    InfoQ 出过一本 Minibook,https://www.infoq.com/minibooks/JTDS/

    总的来讲,和 Spring 与 Java EE 的关系一样,Spring 的事务只是将事务概念抽象从传统的 Java EE 容器搬到 Spring (容器 )。如果熟悉 JTA 和 Java EE/Jakarta EE 的话,JTA 更简单,功能的优势不用说了。

    我不得不 Spring 也是容器(和 Java EE 一样,形成一套依赖环境),现在一个 Spring 程序的启动不见得比嵌入的 Java EE 容器快。
    hantsy
        17
    hantsy  
       2021-03-24 10:52:05 +08:00
    @hehe12980 你写过补偿机制?说得头头是道。
    liuhuan475
        18
    liuhuan475  
       2021-03-24 11:35:18 +08:00
    jdbc 开启事务就是执行 set autocommit = false; 执行完没异常 commit;有异常 rollback();
    xuanbg
        19
    xuanbg  
       2021-03-24 11:49:46 +08:00
    @hantsy 反正最终还是要肉偿的……
    lewis89
        20
    lewis89  
       2021-03-24 17:06:49 +08:00
    @hehe12980 主要是 2pc 3pc 没有什么必要,本来拆分成微服务就是希望能使用事件驱动的架构风格,这样服务与服务之间的分布式事务都是用消息补偿机制来做,一方面这样服务就实现解耦了,另一方对于非主干业务流程合并在主业务里面没有任何必要,像你下单送个优惠券,下单 commit 就完事了,送优惠券这个事情 早送晚送都可以 问题不大。
    dbpe
        21
    dbpe  
       2021-03-24 17:12:16 +08:00
    @hehe12980 补偿是用过 mq 去做么?
    hehe12980
        22
    hehe12980  
       2021-03-24 17:22:03 +08:00
    @dbpe mq 和 redis 都能做,mq 比较主流
    hehe12980
        23
    hehe12980  
       2021-03-24 17:24:33 +08:00
    @hantsy 做过
    cubecube
        24
    cubecube  
       2021-03-24 22:25:39 +08:00
    @trascation 的实质是接管了 DataSource,然后帮你 begin 、end 了一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5648 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:20 · PVG 11:20 · LAX 19:20 · JFK 22:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.