前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Transactional事务传播行为?

Transactional事务传播行为?

作者头像
用户9919783
发布2022-07-26 11:30:04
3910
发布2022-07-26 11:30:04
举报

事务传播行为有7种,不是与数据库交互,数据库定义的,而是spring框架自带的。

本文主要介绍三种:required、nested、required_new。

Propagation_required(传播要求):默认的,最常见的,如果当前没有事务,就新建事务执行,若有事务,就加入当前事务执行。外围方法未开启事务的情况下,内部两个事务开启此事务是互不干扰的,且不受外围异常影响。

默认传播要求下,内围事务里面若异常捕获到,则此内围事务里的其他程序正常运行。外围事务捕获到异常,外围及其其他内围事务不可以正常运行。

Propagation_supports(传播支持):支持当前事务,若没有事务,就以非事务执行。Propagation_mandatory(强制性):若当前无事务,抛出异常。

Propagation_requires_new:新建事务,若当前存在事务,吧当前事务挂起。外围方法未开启事务的情况下,内部两个事务开启此事务是互不干扰的,且不受外围异常影响。

若外围开启事务,requeired内围事务和外围事务是同时回滚的。

若requreis_new内围事务异常未被捕获,则requeired内围事务与外围事务一起回滚,其他requreis_new内围事务不受影响。

若requreis_new内围事务异常被trycatch捕获,则外围其他事务不受影响。

Propagation_not_supported(非支持):以非事务操作,若当前存在事务,吧事务挂起。

Propagation_never:以非事务方式执行,若当前存在事务,则抛出异常。

Propagation_nested(传播嵌套):如果当前存在事务,则在嵌套内执行,如果没有事务,则执行Propagation_required操作。外围方法未开启事务的情况下,内部两个事务开启此事务是互不干扰的,且不受外围异常影响。

1、propagaration_requeire_new与Propagation_nested嵌套传播区别:

Nested若外围事务开启,因为是父子嵌套事务,则子事务都随外围主事务的回滚而回滚,子事务滚回则所有事务一起回滚,除非当前子事务被trycatch捕获。而requeires_new外围事务和内围事务是两个事务,外围事务回滚不会影响内部事务。

2、Nested和requeired区别:

都会随着外围事务的回滚而一起回滚。Requeired是属于加入外围事务,因为都属于同一个事务,一旦内围事务回滚不管是否trycatch捕获,所有都一起回滚。而nested属于子事务,有单独的保存节点,所以nested方法抛出异常trycatch捕获被回滚,不会影响外围事务。

代码实例如下:

required实例,使用默认事务实例,不管是否捕获异常,全部一起回滚

nested实例,因为嵌套事务,外围内围都会随着互相回滚而回滚,除非子事务被捕获异常

required_new实例,当外围抛出异常时候,不会影响内围业务正常存入数据库

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档