1、事务的概念html
事务是保证数据库从一个一致性的状态永久地变成另一个一致性状态的根本,其中,ACID是事务的基本特性。java
A是Atomicity,原子性。一个事务每每涉及到许多的子操做,原子性则保证这些子操做要么都作,要么都不作,而不至于出现事务的部分操做成功,而另一部分操做没有成功。若是事务在执行的过程当中发生错误,那么数据库将回滚到事务发生以前的状态。好比银行的转帐服务,这个事务的最终结果必定是:某个帐户的余额增长了x,而另一个帐户的余额减小了x,或者两个帐户的余额未发生变化。而不会出现其余状况。算法
C是Consistency,一致性。一致性是指事务发生前和发生之后,都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整性。这种约束关系能够是数据库内部的约束,好比数据库元素的值必须在必定的范围内,也能够是应用带来的约束,好比转帐之后银行帐户的余额不能为负数。sql
I是Isolation,隔离性。一个事务的操做在未提交之前,是不会被并行发生的其余事务访问到的。也就是说,数据库操做不会看到某个事务的中间操做结果,好比转帐过程当中,用户是不能查询到一个帐户余额减小了,而另一个帐户余额未发生变化的状况。数据库
D是Durability,持久性。事务完成之后,它对数据库的影响是永久性的,即便在数据库系统发生宕机或者其余故障的状况下,这种影响也会获得保持。网络
来自 <http://www.blogjava.net/freeman1984/archive/2011/10/09/360269.html>nosql
2 两阶段提交分布式
在分布式系统中,事务每每包含有多个参与者的活动,单个参与者上的活动是可以保证原子性的,而多个参与者之间原子性的保证则须要经过两阶段提交来实现,两阶段提交是分布式事务实现的关键。spa
很明显,两阶段提交保证了分布式事务的原子性,这些子事务要么都作,要么都不作。而数据库的一致性是由数据库的完整性约束实现的,持久性则是经过commit日志来实现的,不是由两阶段提交来保证的。至于两阶段提交如何保证隔离性,能够参考Large-scale Incremental Processing Using Distributed Transactions and Notifications中两阶段提交的具体实现。.net
两阶段提交的过程涉及到协调者和参与者。协调者能够看作成事务的发起者,同时也是事务的一个参与者。对于一个分布式事务来讲,一个事务是涉及到多个参与者的。具体的两阶段提交的过程以下:
第一阶段:
首先,协调者在自身节点的日志中写入一条的日志记录,而后全部参与者发送消息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
来自 <http://www.blogjava.net/freeman1984/archive/2011/10/09/360269.html>
ORACLE 自治事务
结束一个自治事务必须提交一个commit、rollback或执行ddl,不然会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back 。保存点没法在自治事务中回滚到父事务中的一个保存点,只能在内部使用保存点。
来自 <http://www.cnblogs.com/Ronger/archive/2012/02/15/2352527.html>
AUTONOMOUS TRANSACTION(自治事务,如下AT)
主事务(如下MT)调用可是独立于它的事务。
运用AT时,有一些注意事项,简单列举以下:
1. 在匿名PL/SQL块中,只有顶级的匿名PL/SQL块能够被设为AT
2. 若是AT试图访问被MT控制的资源,可能有deadlock发生.
3. Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT
4. AT程序必须以commit 或rollback结尾,不然会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back
在程序开发时,若是充分运用AUTONOMOUS TRANSACTION的特性,必定能取得事倍功半的效果.
分布式事务是指发生在多台数据库之间的事务,Oracle中经过dblink方式进行事务处理,分布式事务比单机事务要复杂的多。大部分的关系型数据库经过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务,