玩转 Spring 全家桶
丁雪丰
美团研究员,《Spring Boot 实战》、《Spring 攻略》译者,腾讯云 TVP。
97978 人已学习
新⼈⾸单¥68
课程目录
已完结/共 123 讲
第十一章:Spring Cloud及Cloud Native概述 (5讲)
玩转 Spring 全家桶
登录|注册
留言
95
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 11 | 什么是Spring的事务抽象(下)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Spring课程介绍
02 | 一起认识Spring家族的主要成员
03 | 跟着Spring了解技术趋势
04 | 编写你的第一个Spring程序
05 | 如何配置单数据源
06 | 如何配置多数据源
07 | 那些好用的连接池们:HikariCP
08 | 那些好用的连接池们:Alibaba Druid
09 | 如何通过Spring JDBC访问数据库
10 | 什么是Spring的事务抽象(上)
11 | 什么是Spring的事务抽象(下)
12 | 了解Spring的JDBC异常抽象
13 | 课程答疑(上)
14 | 课程答疑(下)
15 | 认识Spring Data JPA
16 | 定义JPA的实体对象
17 | 开始我们的线上咖啡馆实战项目:SpringBucks
18 | 通过Spring Data JPA操作数据库
19 | Spring Data JPA的Repository是怎么从接口变成Bean的
20 | 通过MyBatis操作数据库
21 | 让MyBatis更好用的那些工具:MyBatis Generator
22 | 让MyBatis更好用的那些工具:MyBatis PageHelper
23 | SpringBucks实战项目进度小结
24 | 通过Docker辅助开发
25 | 在Spring中访问MongoDB
26 | 在Spring中访问Redis
27 | Redis的哨兵与集群模式
28 | 了解Spring的缓存抽象
29 | Redis在Spring中的其他用法
30 | SpringBucks实战项目进度小结
31 | Project Reactor介绍(上)
32 | Project Reactor介绍(下)
33 | 通过Reactive的方式访问Redis
34 | 通过Reactive的方式访问MongoDB
35 | 通过Reactive的方式访问RDBMS
36 | 通过AOP打印数据访问层的摘要(上)
37 | 通过AOP打印数据访问层的摘要(下)
38 | SpringBucks实战项目进度小结
39 | 编写第一个Spring MVC Controller
40 | 理解Spring的应用上下文
41 | 理解请求的处理机制
42 | 如何定义处理方法(上)
43 | 如何定义处理方法(下)
44 | Spring MVC中的视图解析机制(上)
45 | Spring MVC中的视图解析机制(下)
46 | Spring MVC中的常用视图(上)
47 | Spring MVC中的常用视图(下)
48 | 静态资源与缓存
49 | Spring MVC中的异常处理机制
50 | 了解Spring MVC的切入点
51 | SpringBucks实战项目进度小结
52 | 课程答疑
53 | 通过RestTemplate访问Web资源
54 | RestTemplate的高阶用法
55 | 简单定制RestTemplate
56 | 通过WebClient访问Web资源
57 | SpringBucks实战项目进度小结
58 | 设计好的RESTful Web Service(上)
59 | 设计好的RESTful Web Service(下)
60 | 什么是HATEOAS
61 | 使用Spring Data REST实现简单的超媒体服务(上)
62 | 使用Spring Data REST实现简单的超媒体服务(下)
63 | 分布式环境中如何解决Session的问题
64 | 使用WebFlux代替Spring MVC(上)
65 | 使用WebFlux代替Spring MVC(下)
66 | SpringBucks实战项目进度小结
67 | 认识Spring Boot的组成部分
68 | 了解自动配置的实现原理
69 | 动手实现自己的自动配置
70 | 如何在低版本Spring中快速实现类似自动配置的功能
71 | 了解起步依赖及其实现原理
72 | 定制自己的起步依赖
73 | 深挖Spring Boot的配置加载机制
74 | 理解配置背后的PropertySource抽象
75 | 认识Spring Boot的各类Actuator Endpoint
76 | 动手定制自己的Health Indicator
77 | 通过Micrometer获取运行数据
78 | 通过Spring Boot Admin了解程序的运行状态
79 | 如何定制Web容器的运行参数
80 | 如何配置容器支持HTTP/2(上)
81 | 如何配置容器支持HTTP/2(下)
82 | 如何编写命令行运行的程序
83 | 了解可执行Jar背后的秘密
84 | 如何将Spring Boot应用打包成Docker镜像文件
85 | SpringBucks实战项目进度小结
86 | 简单理解微服务
87 | 如何理解云原生(Cloud Native)
88 | 12-Factor App(上)
89 | 12-Factor App(下)
90 | 认识Spring Cloud的组成部分
91 | 使用Eureka作为服务注册中心
92 | 使用Spring Cloud Loadbalancer访问服务
93 | 使用Feign访问服务
94 | 深入理解服务发现背后的DiscoveryClient
95 | 使用Zookeeper作为服务注册中心
96 | 使用Consul作为服务注册中心
97 | 使用Nacos作为服务注册中心
98 | 如何定制自己的DiscoveryClient
99 | SpringBucks实战项目进度小结
100 | 使用Hystrix实现服务熔断(上)
101 | 使用Hystrix实现服务熔断(下)
102 | 如何观察服务熔断
103 | 使用Resilience4j实现服务熔断
104 | 使用Resilience4j实现服务限流(上)
105 | 使用Resilience4j实现服务限流(下)
106 | SpringBucks实战项目进度小结
107 | 基于Git的配置中心(上)
108 | 基于Git的配置中心(下)
109 | 基于Zookeeper的配置中心
110 | 深入理解Spring Cloud的配置抽象
111 | 基于Consul的配置中心
112 | 基于Nacos的配置中心
113 | SpringBucks实战项目进度小结
114 | 认识Spring Cloud Stream
115 | 通过Spring Cloud Stream访问RabbitMQ
116 | 通过Spring Cloud Stream访问Kafka
117 | SpringBucks实战项目进度小结
118 | 通过Dapper理解链路治理
119 | 使用Spring Cloud Sleuth实现链路追踪
120 | 如何追踪消息链路
121 | 除了链路还要治理什么
122 | SpringBucks实战项目进度小结
123 | 结课测试&结束语
本节摘要

PDF 课件和源代码下载地址:

https://gitee.com/geektime-geekbang/geektime-spring-family

猜你喜欢

unpreviewunpreview

登录 后留言

全部留言(95)

  • 最新
  • 精选
刘哥聊技术
第一步:注入实例 @Autowired private FooService fooService; 第二步:添加实现 //把自己的实例注入进来,比较方便理解 @Override public void invokeInsertThenRollbackBySelfService() throws RollbackException { fooService.insertThenRollback(); } //获取当前代理,这样写避免了自己调用自己的实例 @Override public void invokeInsertThenRollbackByAopContext() throws RollbackException { ((FooService) (AopContext.currentProxy())).insertThenRollback(); } //再加一层事务 @Transactional(rollbackFor = RollbackException.class) @Override public void invokeInsertThenRollbackAddTransactional() throws RollbackException { insertThenRollback(); } 第三步:添加测试方法 可以先注释CommandLineRunner里面的内容 @Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class DeclarativeTransactionDemoApplicationTests { @Autowired private FooService fooService; @Autowired private JdbcTemplate jdbcTemplate; @Test public void invokeInsertThenRollback() { try { fooService.invokeInsertThenRollback(); } catch (Exception e) { log.info("BBB {}", jdbcTemplate .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='BBB'", Long.class)); } } @Test public void invokeInsertThenRollbackBySelfService() { try { fooService.invokeInsertThenRollbackBySelfService(); } catch (Exception e) { log.info("BBB {}", jdbcTemplate .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='BBB'", Long.class)); } } @Test public void invokeInsertThenRollbackByAopContext() { try { fooService.invokeInsertThenRollbackByAopContext(); } catch (Exception e) { log.info("BBB {}", jdbcTemplate .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='BBB'", Long.class)); } } @Test public void invokeInsertThenRollbackAddTransactional() { try { fooService.invokeInsertThenRollbackAddTransactional(); } catch (Exception e) { log.info("BBB {}", jdbcTemplate .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='BBB'", Long.class)); } } }

作者回复: 干得漂亮

2019-02-17
9
163
YANG
在当前类的方法中通过AopContext.currentProxy()获取当前类的代理对象,再调用的代理对象的方法(其实是增强后的方法),事务就会生效了。

作者回复: 是的,你提到了代理,可以把自己的实例注入进来,内部方法调用改为直接调用注入的实例。因为Spring其实是为你创建了一个代理,那我们调用代理就好了。其效果是一样的。

2019-02-11
35
哈哈哈
思考题答案:((FooService) (AopContext.currentProxy())).insertThenRollback();测过了是对的。 但我觉得最好的方法是避免这种内部调用

作者回复: 这是一种方法,还有种更简单的做法是把自己的实例注入进来,内部方法调用改为直接调用注入的实例。因为Spring其实是为你创建了一个代理,那我们调用代理就好了。

2019-02-11
2
26
北极的大企鹅
比较想问的是学完框架后,是先学设计模式还是先学JVM原理,并发与线程安全,然后中间件和架构设计,数据库设计,Linux学习,跨语言学习顺序,这些都是按照什么样的顺序学习的,还有源码阅读顺序

作者回复: 你说的这些如果是做Java后端的话,迟早都是要接触到的,个人觉得无所谓先后,建议先广泛地涉猎这些知识,并不一定要很精通,但要知道了解,一旦遇到了问题,要能在第一时间想到在哪里能找到相关的材料,能快速拎起来。

2019-04-11
2
24
十一
方法添加事务注解,应该就可以了

作者回复: 这……也是个办法,但不是我这个问题的本意哈

2019-02-13
3
12
Hana
给类中的一个方法加transaction注解,整个类实例就由改事务代理类来创建了吗?为啥通过实例访问类中的另一个方法,调用方为啥会被事务advice 环绕?

作者回复: 并不是改由代理类来创建,而是先创建了自身的实例A,然后再加了一层封装的代理B,Spring Bean注入给其他人时,注入的不是A,而是B。所以通过Bean来调用时,调用的是B.xxx(),在A自身内部调用内部方法时,调用的还是A.xxx()。

2020-01-26
2
11
小肩膀
一个类自身调用自身的方法,例如A()调用B(),此时B方法的事务不起作用,由于事务增强处理是交给aop生成的代理类完成,A()方法未做事务处理,那么调用代理类的A()方法同样不具备事务。 需要把A()移到不同于B()的类中,即可达到预期效果

作者回复: 事务的确是AOP代理来实现的,不过你这里的A和B把我说晕了……把类的内部调用改成不同类之间的调用,其本质其实也是调用代理类的方法,所以效果是一样的。

2019-02-13
2
8
马鹿
老师 请问一下 我的方法中有操作不同数据库的操作 比如操作mysql redis ,在异常后无法回滚。这种情况我该怎么办呢

作者回复: Redis不算RDBMS,算NoSQL,MySQL和Redis本来就没有自动的事务关联,你只能手写,在MySQL回滚时自己清理Redis。哪怕是两个MySQL,也没有很好的分布式事务实现,JTA这种性能不是很理想,基本都是要靠自己实现,关于分布式事务可以了解下BASE和TCC的概念。

2019-06-18
6
飞翔的傻瓜
自己注入自己会不会循环引用~

作者回复: 有时会,这时可以用延时注入的方式解决。

2020-06-03
5
天王
讲的内容偏重于应用,是否可以深入的说下,比如,事物执行的原理,详细的说下,这样能加深理解,也能明白各个属性具体怎么工作的, 在执行过程中,怎么起作用。只讲偏应用,过去之后,就忘记了。

作者回复: 你好,这个部分的确以应用为主一些,后续的章节有些地方会做展开,考虑到大部分同学的情况,不会在课程中就每个点都去展开,还请理解。相信你提了这个问题,那应该也能从我在课程中说道的Spring的事务其实是通过AOP实现的这句中理解事务的原理,对吧:-)

2019-02-13
5
收起评论