- 浏览: 18630 次
最新评论
1 事务的ACID
事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。
A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操作成功,而另外一部分操作没有成功。如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态。比如银行的转账服务,这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化。而不会出现其他情况。
C是Consistency,一致性。一致性是指事务发生前和发生以后,都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整性。这种约束关系可以是数据库内部的约束,比如数据库元素的值必须在一定的范围内,也可以是应用带来的约束,比如转账以后银行账户的余额不能为负数。
I是Isolation,隔离性。一个事务的操作在未提交以前,是不会被并行发生的其他事务访问到的。也就是说,数据库操作不会看到某个事务的中间操作结果,比如转账过程中,用户是不能查询到一个账户余额减少了,而另外一个账户余额未发生变化的情况。
D是Durability,持久性。事务完成以后,它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其他故障的情况下,这种影响也会得到保持。
2 两阶段提交
在分布式系统中,事务往往包含有多个参与者的活动,单个参与者上的活动是能够保证原子性的,而多个参与者之间原子性的保证则需要通过两阶段提交来实现,两阶段提交是分布式事务实现的关键。
很明显,两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做。而数据库的一致性是由数据库的完整性约束实现的,持久性则是通过commit日志来实现的,不是由两阶段提交来保证的。至于两阶段提交如何保证隔离性,可以参考Large-scale Incremental Processing Using Distributed Transactions and Notifications中两阶段提交的具体实现。
两阶段提交的过程涉及到协调者和参与者。协调者可以看做成事务的发起者,同时也是事务的一个参与者。对于一个分布式事务来说,一个事务是涉及到多个参与者的。具体的两阶段提交的过程如下:
第一阶段:
首先,协调者在自身节点的日志中写入一条的日志记录,然后所有参与者发送消息prepare T,询问这些参与者(包括自身),是否能够提交这个事务;
参与者在接受到这个prepare T 消息以后,会根据自身的情况,进行事务的预处理,如果参与者能够提交该事务,则会将日志写入磁盘,并返回给协调者一个ready T信息,同时自身进入预提交状态状态;如果不能提交该事务,则记录日志,并返回一个not commit T信息给协调者,同时撤销在自身上所做的数据库改;
参与者能够推迟发送响应的时间,但最终还是需要发送的。
第二阶段:
协调者会收集所有参与者的意见,如果收到参与者发来的not commit T信息,则标识着该事务不能提交,协调者会将Abort T 记录到日志中,并向所有参与者发送一个Abort T 信息,让所有参与者撤销在自身上所有的预操作;
如果协调者收到所有参与者发来prepare T信息,那么协调者会将Commit T日志写入磁盘,并向所有参与者发送一个Commit T信息,提交该事务。若协调者迟迟未收到某个参与者发来的信息,则认为该参与者发送了一个VOTE_ABORT信息,从而取消该事务的执行。
参与者接收到协调者发来的Abort T信息以后,参与者会终止提交,并将Abort T 记录到日志中;如果参与者收到的是Commit T信息,则会将事务进行提交,并写入记录
一般情况下,两阶段提交机制都能较好的运行,当在事务进行过程中,有参与者宕机时,他重启以后,可以通过询问其他参与者或者协调者,从而知道这个事务到底提交了没有。当然,这一切的前提都是各个参与者在进行每一步操作时,都会事先写入日志。
唯一一个两阶段提交不能解决的困境是:当协调者在发出commit T消息后宕机了,而唯一收到这条命令的一个参与者也宕机了,这个时候这个事务就处于一个未知的状态,没有人知道这个事务到底是提交了还是未提交,从而需要数据库管理员的介入,防止数据库进入一个不一致的状态。当然,如果有一个前提是:所有节点或者网络的异常最终都会恢复,那么这个问题就不存在了,协调者和参与者最终会重启,其他节点也最终也会收到commit T的信息。
3 日志
数据库日志保证了事务执行的原子性和持久性,日志类型可以分为redo log,undo log,undo/redo log。
事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。
A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操作成功,而另外一部分操作没有成功。如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态。比如银行的转账服务,这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化。而不会出现其他情况。
C是Consistency,一致性。一致性是指事务发生前和发生以后,都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整性。这种约束关系可以是数据库内部的约束,比如数据库元素的值必须在一定的范围内,也可以是应用带来的约束,比如转账以后银行账户的余额不能为负数。
I是Isolation,隔离性。一个事务的操作在未提交以前,是不会被并行发生的其他事务访问到的。也就是说,数据库操作不会看到某个事务的中间操作结果,比如转账过程中,用户是不能查询到一个账户余额减少了,而另外一个账户余额未发生变化的情况。
D是Durability,持久性。事务完成以后,它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其他故障的情况下,这种影响也会得到保持。
2 两阶段提交
在分布式系统中,事务往往包含有多个参与者的活动,单个参与者上的活动是能够保证原子性的,而多个参与者之间原子性的保证则需要通过两阶段提交来实现,两阶段提交是分布式事务实现的关键。
很明显,两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做。而数据库的一致性是由数据库的完整性约束实现的,持久性则是通过commit日志来实现的,不是由两阶段提交来保证的。至于两阶段提交如何保证隔离性,可以参考Large-scale Incremental Processing Using Distributed Transactions and Notifications中两阶段提交的具体实现。
两阶段提交的过程涉及到协调者和参与者。协调者可以看做成事务的发起者,同时也是事务的一个参与者。对于一个分布式事务来说,一个事务是涉及到多个参与者的。具体的两阶段提交的过程如下:
第一阶段:
首先,协调者在自身节点的日志中写入一条的日志记录,然后所有参与者发送消息prepare T,询问这些参与者(包括自身),是否能够提交这个事务;
参与者在接受到这个prepare T 消息以后,会根据自身的情况,进行事务的预处理,如果参与者能够提交该事务,则会将日志写入磁盘,并返回给协调者一个ready T信息,同时自身进入预提交状态状态;如果不能提交该事务,则记录日志,并返回一个not commit T信息给协调者,同时撤销在自身上所做的数据库改;
参与者能够推迟发送响应的时间,但最终还是需要发送的。
第二阶段:
协调者会收集所有参与者的意见,如果收到参与者发来的not commit T信息,则标识着该事务不能提交,协调者会将Abort T 记录到日志中,并向所有参与者发送一个Abort T 信息,让所有参与者撤销在自身上所有的预操作;
如果协调者收到所有参与者发来prepare T信息,那么协调者会将Commit T日志写入磁盘,并向所有参与者发送一个Commit T信息,提交该事务。若协调者迟迟未收到某个参与者发来的信息,则认为该参与者发送了一个VOTE_ABORT信息,从而取消该事务的执行。
参与者接收到协调者发来的Abort T信息以后,参与者会终止提交,并将Abort T 记录到日志中;如果参与者收到的是Commit T信息,则会将事务进行提交,并写入记录
一般情况下,两阶段提交机制都能较好的运行,当在事务进行过程中,有参与者宕机时,他重启以后,可以通过询问其他参与者或者协调者,从而知道这个事务到底提交了没有。当然,这一切的前提都是各个参与者在进行每一步操作时,都会事先写入日志。
唯一一个两阶段提交不能解决的困境是:当协调者在发出commit T消息后宕机了,而唯一收到这条命令的一个参与者也宕机了,这个时候这个事务就处于一个未知的状态,没有人知道这个事务到底是提交了还是未提交,从而需要数据库管理员的介入,防止数据库进入一个不一致的状态。当然,如果有一个前提是:所有节点或者网络的异常最终都会恢复,那么这个问题就不存在了,协调者和参与者最终会重启,其他节点也最终也会收到commit T的信息。
3 日志
数据库日志保证了事务执行的原子性和持久性,日志类型可以分为redo log,undo log,undo/redo log。
发表评论
-
aaa
2018-03-26 17:23 01、前后端安全方案(防篡改、防重放、敏感信息加解密、防XSS攻 ... -
ssssss
2018-03-26 16:16 02015年年度计划 1、熟悉环境、架构、开发流程 2、业务模 ... -
golsing
2018-03-26 16:14 02015年年度计划 1、熟悉环境、架构、开发流程 2、业务模 ... -
ClientServiceRestTemplateImpl
2018-03-10 17:23 628package com.pingan.ff.btoam.dem ... -
ClientService
2018-03-10 17:34 498package com.pingan.ff.btoam.dem ... -
ClientConfig
2018-03-10 17:33 447package com.pingan.ff.btoam.dem ... -
responseDTO
2018-03-10 17:32 572package com.pingan.ff.btoam.dem ... -
配置项
2018-03-10 17:31 497client.connectTimeout=60000 cli ... -
HttpsClientRequestFactory
2018-03-08 20:48 1472package com.pingan.ff.btoam.dem ... -
HttpsTest
2018-03-08 20:23 864package com.pingan.ff.btoam.dem ... -
dfdfdf
2018-03-08 20:22 543<!--连接池管理 --> <bean ... -
sdds
2018-03-08 20:19 54package com.pingan.ff.esb.proxy ... -
ddsd
2018-03-08 20:29 711import java.security.cert.Certi ... -
测试一下
2017-08-23 13:50 589测试测试测试测试测试测试测试 -
面经面经
2017-03-29 19:13 558一、简历 简历里面需要 ... -
浅谈https\ssl\数字证书
2015-03-03 11:15 529http://www.cnblogs.com/P_Chou/a ... -
Java多线程总结之线程安全队列Queue
2015-01-07 15:20 864在Java多线程应用中,队列的使用率很高,多数生产消费模型的 ... -
面试问题
2015-01-07 14:45 587今天被架构师问了一连串的问题,估计问了有一个多小时 ... -
http长连接与短连接
2015-01-05 17:34 5731. HTTP协议与TCP/IP协议的关系 HTTP的长 ... -
ZooKeeper原理
2014-12-30 09:33 650ZooKeeper是一个分布式的,开放源码的分布式应用 ...
相关推荐
【事务和两阶段提交法1】深入解析 在数据库领域,事务是确保数据一致性、完整性和可靠性的核心概念。事务的ACID特性是其基石,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性...
总的来说,了解和掌握两阶段提交对于理解和实现分布式系统中的事务管理至关重要,但同时也需要意识到它的局限性,并寻找更适应大规模分布式环境的解决方案。在实际应用中,根据具体场景选择合适的事务处理策略是确保...
一阶段提交(One-Phase Commit)和两阶段提交(Two-Phase Commit)是分布式事务中常见的两种提交协议,它们主要用于保证跨多个数据库节点的事务一致性。 1. **一阶段提交** 一阶段提交简单直接,应用程序向数据库...
两阶段提交协议是实现分布式事务保证原子性、一致性、隔离性和持久性(即ACID属性)的关键技术之一。 传统的两阶段提交协议(2PC)将事务处理分为两个阶段:预提交阶段和决策阶段。在预提交阶段,事务协调者询问...
总的来说,理解并掌握WebSphere MQ的XA事务处理和两阶段提交机制对于构建高可用、强一致性的分布式系统至关重要。这种技术不仅适用于WMQ与Oracle数据库的组合,还可以应用于其他支持XA的资源管理器,实现更复杂的...
两阶段提交(Two-Phase Commit, 2PC)是一种经典的分布式事务提交协议,分为准备阶段和提交阶段。在准备阶段,事务协调者(事务管理器)向所有参与者(资源管理器)发送Prepare消息,参与者执行事务但不提交,处于...
总之,MongoDB的两阶段提交机制是为了解决多文档操作的一致性问题,它在分布式环境中保证了事务的原子性和一致性,使得在非关系型数据库中也能实现类似关系型数据库的事务管理。然而,使用时需要注意其潜在的性能...
两阶段提交(2PC)是一种分布式事务提交算法,在分布式环境下,所有节点进行事务提交,保持一致性的算法。它通过引入一个协调者(Coordinator)来统一掌控所有参与者(Participant)的操作结果,并指示它们是否要把...
Greenplum两阶段事务源码分析,本ppt主要讲述了整个greenplum的两阶段事务的状态切换、调用流程和日志类型。
其中,AT模式是Seata的默认模式,它通过本地事务和两阶段提交的优化,实现了高性能的分布式事务处理。TCC模式则是一种补偿型事务,业务服务需要提供Try、Confirm和Cancel三个操作,Try是尝试执行业务,Confirm是确认...
### Oracle与MySQL两阶段提交的例子(EJB3) #### 一、引言 ...通过对基本原理的理解和实际代码的分析,读者应该能够更好地理解EJB3中事务管理和两阶段提交的相关概念,并能将其应用于实际的开发工作中。
在Greenplum数据库中,事务是通过两阶段提交协议来实现的,即Prepare和Commit两个阶段。 在事务的开始阶段,客户端会向服务器发送BeginTransaction命令,以启动事务。服务器收到命令后,会创建一个事务块...
两阶段提交(Two-Phase Commit, 2PC)是一种分布式协调协议,用于在分布式系统中确保所有参与者对事务的一致性处理。在MySQL等数据库管理系统中,2PC被用来协调参与分布式事务的不同节点,保证数据的一致性和完整性...
Seata Server 1.4.0 版本是该项目的最新稳定版本,其主要功能包括全局事务、分支事务和两阶段提交协议等。 全局事务(Global Transaction)在 Seata 中扮演着核心角色,它协调各个分布式服务中的局部事务,确保在...
协调器通过两阶段提交(2PC)协议确保所有参与事务的节点都能达成一致。 4. **可扩展性**:Atomikos设计时考虑了高并发和大规模分布式系统的需要,能够处理大量并发的事务,并且可以动态调整事务管理的性能和资源...
两阶段提交协议(2PC)是一种经典的分布式事务协议,其设计目的是在多个数据库系统之间同步事务,以保证事务的原子性和一致性。2PC协议的核心在于它将事务提交过程分为两个阶段:预提交阶段和提交阶段。在预提交阶段...
- **Global Transaction Manager (GTM)**:BekeleyDB本身不提供全局事务管理功能,但它支持分布式事务和两阶段提交协议,可以通过第三方GTM来实现跨多个数据库环境的事务处理。 #### 二、BerkeleyDB适用场景 在...
【分布式系统一致性发展史(二)】:两阶段与三阶段提交 在分布式系统中,一致性是确保系统在面临各种网络、硬件故障时仍然能够保持数据一致性的关键特性。本篇将探讨两种早期用于解决一致性问题的协议:两阶段提交...
undo日志则用于回滚事务和两阶段提交的回滚操作。 6. **页缓冲池(Buffer Pool)**:InnoDB将数据页存储在内存中的缓冲池中,以减少磁盘I/O操作,提高性能。缓冲池的管理策略包括LRU(最近最少使用)和FIFO(先进先...