请问 spring 里的事务和数据库中的事务本质上是一个东西吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rqxiao
V2EX    Java

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

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

    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     Solana     2554 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:45 PVG 20:45 LAX 04:45 JFK 07:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86