- 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。关于这几种日志形式的具体介绍,可以参照:
http://nosql-wiki.org/foswiki/bin/view/Main/TransactonLog
转载自:http://rdc.taobao.com/blog/cs/?p=1183
相关推荐
【数据库一阶段提交和两阶段提交的区别】 一阶段提交(One-Phase Commit)和两阶段提交(Two-Phase Commit)是分布式事务中常见的两种提交协议,它们主要用于保证跨多个数据库节点的事务一致性。 1. **一阶段提交*...
然而,1PC的缺点在于其"危险期"即事务的实际提交时间,这个时间段内若发生网络中断、服务器宕机等问题,可能导致数据不一致。但考虑到性能优势,许多团队在对性能有较高要求且能容忍较低概率的数据不一致情况下,会...
4. **XA Transactions**: JTA使用X/Open XA协议来支持两阶段提交(2PC)过程,确保跨多个资源的事务一致性。`XAResource`接口是实现这一协议的关键。 5. **TransactionSynchronizationRegistry**: 提供了在事务上...
2. **事务管理器(Transaction Manager)**:负责事务的开始、提交、回滚以及两阶段提交(2PC)等操作,确保事务的正确执行。 3. **资源管理器(Resource Manager)**:如数据库、消息队列等,它们实现了 javax....
- **XAResource**:由资源管理器实现,提供与事务管理器交互的接口,用于支持两阶段提交等分布式事务协议。 #### 实现考量与应用场景 JTA规范不仅提供了接口定义,还详细阐述了在组件化企业应用服务器环境中实现...
Spring提供了两种主要的方式来实现JTA事务管理:基于XML配置和基于注解的配置。通过这些方式,开发者可以声明式地控制事务的边界,使得代码更简洁、可维护性更强。 在描述中提到的“博文链接:...
在JTA-1.0.1B.jar中,JTS负责处理事务的传播、两阶段提交(2PC)等复杂逻辑。 5. **JTAS(Java Transaction Admin Service)**:提供了配置和管理事务服务的能力,包括注册和管理XAResource,监控事务状态等。 在...
此外,Atomikos会处理两阶段提交过程,确保所有参与事务的资源都一致地提交或回滚。 在压缩包文件"michael_jta_code"中,可能包含了一个示例项目,展示了如何在Spring和Atomikos的配合下实现分布式事务。这个项目...
此外,JTA还支持两阶段提交(2PC)协议,以协调不同资源的提交过程,确保全局一致性。 总之,JTA分布式事务的示例代码展示了如何在Java环境中处理跨多个数据源的事务,保证在分布式系统中的数据一致性。理解和掌握...
1. **UserTransaction**:这是JTA提供的核心接口,应用程序通过它来启动、提交、回滚事务。例如,用户可以通过`UserTransaction.begin()`开始一个新事务,`UserTransaction.commit()`提交事务,或者`UserTransaction...
而XAResource接口则是由资源管理器(如数据库驱动)实现,用于与事务管理器交互,参与两阶段提交协议。 JTA 1.0.1B相较于早期版本可能包含了一些性能优化和bug修复,使其更加稳定可靠。"jta.license.txt"文件很可能...
2. **XA协议支持**:Atomikos 遵循X/Open XA标准,允许它与遵循此标准的资源管理器(如数据库)进行交互,进行两阶段提交(2PC)以确保跨系统的一致性。 3. **事务超时和恢复**:Atomikos 可以设置事务超时,防止...
- **XA事务**:JTA使用的两阶段提交(2PC)协议,保证所有参与的资源在同一时间提交或回滚。 - **异常处理**:在事务处理中,异常处理是非常重要的,因为任何异常都可能导致事务回滚。 - **Spring框架的支持**:...
JTA允许应用程序在不同的数据源之间进行跨平台的事务管理,支持两阶段提交(2PC)等高级事务特性。Geronimo JTA 1.1包含了以下关键组件: 1. UserTransaction接口:应用程序通过该接口启动、回滚和查询当前事务状态...
它实现了两阶段提交协议(2PC),以确保跨多个资源的一致性。 在描述中提到的"michael_jta_code"可能包含以下示例: - **分布式事务示例**:展示如何在一个事务中同时更新两个不同的数据源,如两个不同的数据库。 ...
JTA通过两阶段提交(2PC)协议来协调跨数据库的事务。在第一阶段,事务管理器询问所有参与的资源是否准备好提交。如果所有资源都准备好了,那么在第二阶段,事务管理器命令所有资源提交事务。如果有任何资源在第一...
XAPool实现了javax.sql.XADataSource接口,这意味着它可以与任何符合JDBC规范的数据库驱动配合使用,并且支持两阶段提交(2PC)的分布式事务。 XAPool的核心特性包括: 1. **连接池管理**:XAPool能够有效地管理和...
8. **编程模式**:JTA提供了两种主要的编程模式:显式事务管理和声明式事务管理。显式事务管理通过代码直接控制事务,而声明式事务管理则依赖于容器(如Java EE应用服务器)来自动管理事务。 9. **异常处理**:JTA...
首先,我们需要理解什么是两阶段提交。两阶段提交是一种分布式事务协调协议,它分为两个阶段:准备阶段(Prepare)和提交阶段(Commit)。在准备阶段,事务协调者询问所有参与者(即涉及事务的各个节点)是否可以...
XA协议是X/Open组织定义的一组两阶段提交协议,用于确保分布式事务的一致性。在JTA中,事务管理器会控制多个资源管理器,协调它们的提交或回滚,以确保所有资源上的操作能够满足ACID属性。尽管JTA提供了强大的事务...