spring的事务传播
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring的事务传播内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring的事务传播相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring的事务传播相关知识
-
Spring事务的传播行为本文主要介绍下Spring事务中的传播行为。事务传播行为介绍Spring中的7个事务传播行为:|事务行为|说明 ||:--|:--||PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务。就新建一个事务 || PROPAGATION_SUPPORTS |支持当前事务,假设当前没有事务,就以非事务方式运行 || PROPAGATION_MANDATORY| 支持当前事务,假设当前没有事务,就抛出异常|| PROPAGATION_REQUIRES_NEW | 新建事务,假设当前存在事务。把当前事务挂起||PROPAGATION_NOT_SUPPORTED | 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起 || PROPAGATION_NEVER | 以非事务方式运行,假设当前存在事务,则抛出异常 || PROPAGATION_NESTED |如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |举例说明案例代
-
Java高频面试题分享(六)——Spring 支持的数据库事务传播属性和事务隔离级别面试题: 请介绍下 Spring 支持的常用数据库事务传播属性和事务隔离级别? 参考答案: 事务传播属性: 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。(一个方法运行在了一个开启事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务)例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。事务的传播行为可以由传播属性指定,Spring 定义了 7 种传播行为。 传播属性 描述 REQUIRED 默认值,如果有事务正在运行,当前的方
-
SpringBoot事务隔离等级和传播行为的那些事儿Spring定义了七种传播行为: 一、开启事物管理 //import org.springframework.transaction.annotation.EnableTransactionManagement; `@SpringBootApplication @EnableTransactionManagement //显示开启事物管理,springboot默认已经开启事物管理,可不用显示的注解 public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Applicat
-
长文捋明白 Spring 事务!隔离性?传播性?一网打尽!@[toc] 事务的重要性不言而喻,Spring 对事务也提供了非常丰富的支持,各种支持的属性应有尽有。 然而很多小伙伴知道,这里有两个属性特别绕: 隔离性 传播性 有多绕呢?松哥都一直懒得写文章去总结。不过最近有小伙伴问到这个问题,刚好有空,就抽空总结一下,我不会干巴巴的和大家讲概念,接下来的所有内容,松哥都会通过具体的案例来和大家演示。 好啦,不废话啦,请看大屏幕。 1. 什么是事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么一起成功,要么一起
spring的事务传播相关课程
spring的事务传播相关教程
- 2. ZAB 的消息广播模式 Zookeeper 为了保证 Zookeeper 集群的数据一致性,使用了 ZAB 协议,在正常工作模式下,ZAB 协议会使用消息广播模式来让 Leader 来对事务性消息进行广播,而且只能有一个 Leader 进行广播。接下来我们就来讲解这个消息广播模式是如何工作的。
- 9.1 事务管理器 transactionManager 在 xml 文件中对应 <transactionManager type="JDBC"/>,其中 type 属性对应了事务管理器的两种类型,分别是JDBC和MANAGED。JDBC :直接使用了 JDBC 的提交和回滚机制。MANAGED:让容器来管理事务的整个生命周期,例如 spring 容器。提示: 如果你使用 spring 作为容器,那么 transactionManager 会被自动配置且可用。
- 2.1 消息广播的数据同步 在我们使用 Zookeeper 客户端向 Zookeeper 集群的某一个 Follower 发送事务请求时,也就是对 Znode 节点的增删改操作时,这个Follower 节点并不会自己去处理这个事务请求,而是会把这个请求转发给 Leader 节点,让 Leader 节点来处理事务请求。Leader 节点接收到 Follower 转发过来的请求,会生成与事务请求相对应的 Proposal 事务提案,并为这个 Proposal 事务提案分配全局唯一的单调递增的事务ID,也就是 ZXID,然后把 Proposal 事务提案发送到集群中所有的 Follower 节点。如果 Leader 节点接收到了多个 Follower 节点转发的请求,Leader 节点会根据 Proposal 事务提案的 ZXID 的先后顺序来对 Follower 节点进行广播。Follower 节点接收到 Proposal 事务提案后,会把接收到的 Proposal 事务提案以事务日志的方式写入本地磁盘中,成功后会向 Leader 节点返回 Ack 确认信息,确定自己能够执行该事务。在这一步骤中, Follower 向 Leader 发送反馈,确认 Follower 节点能够执行该事务,但不会去提交该事务请求。Leader 节点接收到半数以上的 Follower 节点返回的 Ack 确认信息后,就会向所有的 Follower 节点广播 Commit 消息,通知 Follower 节点提交事务请求,同时 Leader 节点自己也会提交该事务请求。接收到 Commit 消息的 Follower 节点就会开始进行事务提交。当 Follower 节点完成事务的提交后,Leader 节点就会把该 Follower 节点加入可用的 Follower 列表中,该Follower 节点就可以对外提供服务了。除了 Follow 节点需要进行数据同步外,Zookeeper 集群还有一种叫做 Observer 的节点会进行数据同步,那么我们接下来简单介绍一下 Observer 节点。
- 5.1 引入分布式事务依赖 在 pom.xml 引入 Atomikos 事务管理器相关的依赖项, Atomikos 是一个开源的事务管理器,支持分布式事务。实例: <!--分布式事务 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency>
- 3.2 无序广播 理解了有序广播之后,无序广播就很容易理解了。无需广播就是没有任何优先级之分,所有广播都是异步同时发送,此时 Receiver 的接收时序也是完全随机的。正因为异步且无需保证时序,所以无需广播更高效,但是不能在各个 Receiver 之间传递数据。
- 2. 事务 什么是事务?一讲到事务,就有一个典型的案例:转账。转账业务涉及到 2 个账号的变更。例如 A 现在要把自己账户上仅有的 100 元大钞转给自己的好朋友 B。转账过程中至少要涉及到两条更新语句:A 账面上的钱减少,使用更新语句实现:Update 账号表 set 我的钱=我的钱-100 where 账号拥有人=AB 账户上的钱增多,使用更新语句实现:Update 账号表 set 我的钱=我的钱+100 where 账号拥有人=B如果、万一这两条更新语句中有一条没有执行成功,会发生什么情况了?发生在 A 身上的更新语句没有成功,B 的更新语句成功了。也就是说 A 账面上的钱没有减少,B 账面上的钱却增加了。天呀!这是何等好事,关键是这钱是从哪里来的,左想右想,看来只能是银行里来的,但是,你觉得银行会做这种傻事吗?不会!那银行又是如何保证不让这种事情发生了。发生在 B 身上的更新语句没有成功,A 的更新语句成功了。也就是说 A 的钱减少了,但是 B 没有增加。傻眼了吧,莫名其妙的钱就不见了。钱去哪儿了?你会让这种事情发生吗?也不会,你会投诉银行的。当然,如果这 2 条 SQL 语句执行成功或者失败,则不会发生任何损失,可见,咱们必须控制这两条 SQL 语句要么都成功,要么都失败。对!这就是事务。所谓事务,就是把一个业务逻辑当成一个逻辑整体单元,其中的执行代码要么一起成功,但凡执行过程中出现了某些错误,就恢复到最原始的状态。转账就是一个业务逻辑,整个业务逻辑中至少包括 2 条 SQL 语句,这 2 条 SQL 语句互为依靠,彼此脱单对业务逻辑没有任何意义。所以,必须当成一个整体看待。一个事务单元有 4 个特性,也就是事务的 ACID 特性:原子性(atomicity): 表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败;一致性(consistency): 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态;如前面转账案例,转账前 A 和 B 加起来有多少钱,无论转账是否成功,最后 A 和 B 加起来的钱应该和前面相等;隔离性(isolation): 事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据;持久性(durability): 事务完成之后,它对于系统的影响是永久性的。事务结束后,就没有什么后悔药了。4 个特性中除了隔离性都比较好理解。所以,剩下的篇幅中,咱们好好聊一聊隔离性。要讲透隔离性,肯定就离不开并发概念。什么是并发?并发是计算机中的一个概念,但是在现实生活中还是能找到一个能类比的例子。火车上,2个人同时去一间洗手间,这个过程可以称其为并发。换成计算机概念就是说两段逻辑代码同时使用同一个资源。当然,这里只是从宏观上理解并发。老公和老婆共用一个账号,大家需要钱时都从这个账号上取,可假设老公和老婆就是两个事务,这 2 个事务如果同时取钱时,就必须隔离,否则就会出现麻烦。2 个事务同时进入这个账号,一查看,很高兴,账面上有钱,于是都想取出这 1000 块钱。银行肯定只能让一个事务成功,要不然银行就亏大了。这便是事务的隔离机制,当一个事务对一个资源进行操作时,必须隔离另一个事务对其进行相关操作。但是,如果隔离的太严格了,事务之间就如同排队,需要一个一个来,将会降低系统的响应时间,使用者会认为,切!这系统设计的够糟糕的,睡了一觉,还没有响应。如果隔离的太宽松了,受事务之间的影响,会发生数据的异常。所以在 JDBC 中一般会提供多种隔离机制,让开发者根据需要进行选择。事务隔离级别从低到高:读取未提交(Read Uncommitted);读取已提交 (Read Committed);可重复读(Repeatable Read);序列化(serializable)。如何选择,当然是需要根据业务需要进行设定。不同的隔离机制下,并发的事务之间会发生一些什么样的事情?
spring的事务传播相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议