spring 中的 @Transactional 和数据库中 START TRANSACTION; 其实是一个东西吗
1
jorneyr 2021-03-24 09:19:17 +08:00
是的,Spring 的 @Transactional 只是代码封装,让使用者更方便,没有发明新东西。
|
2
RedBeanIce 2021-03-24 09:20:15 +08:00
这个要等一个看过 Spring 相关源码的大佬来回答了。~
数据库那部分我所理解的是开启一个事务,需要手动提交。 |
3
ymmud 2021-03-24 09:20:38 +08:00
不全是,不局限于数据库事务
|
4
blackkkk 2021-03-24 09:26:07 +08:00
@Transactional 最终还是转换成数据库里面的开启事务,异常则调用 rollback 回滚。当然除了简单的开启关闭事物,过程中还可以做事务传播的相关操作,并不完全等于数据库里面简单的开启关闭事务。
|
5
xkzhangsan 2021-03-24 09:31:20 +08:00 via Android
本质上是一个,spring 是基于 AOP 实现的,自动提交,没有数据库的灵活。
|
6
cheng6563 2021-03-24 09:31:49 +08:00
Spring 调用 jdbc,jdbc 再调用数据库事务。
|
7
timethinker 2021-03-24 09:32:22 +08:00 1
声明式事务实现原理就是利用 AOP 代理拦截目标方法,在目标方法调用前后实施事务外围工作。
感兴趣的可以看一下 org.springframework.transaction.interceptor.TransactionInterceptor |
8
myBatis 2021-03-24 09:33:13 +08:00
事务指的是一组逻辑操作,你甚至可以把一组 if else 称之为事务。单就事务本身的话,二者含义是一样的。
|
9
anonydmer 2021-03-24 09:33:42 +08:00 3
不全是:
spring 的事务包含传播属性( Propagation )和隔离级别( Isolation )两部分内容,隔离级别是数据库层面的;传播属性是 Java 中的概念,最早产生于 JTA,不过 spring 做了一些扩展; 从 @Transactional 的 api 文档中也可以看到,它有几个设置项,其中就包括 Propagation Type 和 Isolation Level |
10
securityCoding 2021-03-24 09:40:10 +08:00 via Android
隔离级别就是一个东西,传播机制是 spring 自己定义的代码事务行为。
|
11
yeqizhang 2021-03-24 09:45:08 +08:00 via Android
普通的就是说数据库事务,分布式事务涉及到业务,从业务代码上写的逻辑……spring 主要是声明式操作事务,事务传播就是什么时候开启一个事务……事务的实现都是数据库层面的事情,事务隔离级别也是,spring 多了个默认级别的配置。
各位大佬,我个人的理解有没有问题?错了请轻喷[狗头] |
12
anonydmer 2021-03-24 09:50:11 +08:00
而且,把 spring 事务理解成简单的数据库事务也是不恰当的; spring 支持多种事务管理,包括 JDBC, JPA, JTA 和 JMS 这些;像 JMS 就不是指数据库场景。
spring 的事务管理是 spring 之所以强大的一个很核心的原因,功能是很丰富和强大的;只不过大部分人只涉及到了很少的场景比如本地事务 |
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 |
14
YoRuo 2021-03-24 10:36:54 +08:00
TransactionAspectSupport invokeWithinTransaction 看一下就明白了
|
15
hehe12980 2021-03-24 10:44:57 +08:00
@hantsy 不用 JTA 很正常,大型分布式系统应该不会考虑使用二阶段三阶段提交这种产物,太影响并发,基本都是做补偿机制,写了 5 年程序的人为啥要用 JTA,没有必然关系把
|
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 容器快。 |
18
liuhuan475 2021-03-24 11:35:18 +08:00
jdbc 开启事务就是执行 set autocommit = false; 执行完没异常 commit;有异常 rollback();
|
20
lewis89 2021-03-24 17:06:49 +08:00
@hehe12980 主要是 2pc 3pc 没有什么必要,本来拆分成微服务就是希望能使用事件驱动的架构风格,这样服务与服务之间的分布式事务都是用消息补偿机制来做,一方面这样服务就实现解耦了,另一方对于非主干业务流程合并在主业务里面没有任何必要,像你下单送个优惠券,下单 commit 就完事了,送优惠券这个事情 早送晚送都可以 问题不大。
|
24
cubecube 2021-03-24 22:25:39 +08:00
@trascation 的实质是接管了 DataSource,然后帮你 begin 、end 了一下
|