啥是事务?
有一组操作组成的可靠的独立的工作单元。
ACID是咋回事?
A(原子性)事务的原子操作单元,对数据的修改,要么全部执行,要么全部不执行;
C(一致性)在事务开始和完成时,数据必须保持一致状态,相关的数据规则必须应用于事务的修改,以保证数据的完整性,事务结束时,所有的内部数据结构必须正确;
I(隔离性)保证事务不受外部并发操作的独立环境执行;
D(持久性)事务完成之后,对于数据的修改是永久的,即使系统出现故障也能够保持;
BASE是咋回事?
BA: Basic Availability 基本业务可用性;
S: Soft state 柔性状态;
E: Eventual consistency 最终一致性;
CAP是咋回事?
C(一致性)一致性是指数据的原子性,在经典的数据库中通过事务来保障,事务完成时,无论成功或回滚,数据都会处于一致的状态,在分布式环境下,一致性是指多个节点数据是否一致;
A(可用性)服务一直保持可用的状态,当用户发出一个请求,服务能在一定的时间内返回结果;
P(分区容忍性)在分布式应用中,可能因为一些分布式的原因导致系统无法运转,好的分区容忍性,使应用虽然是一个分布式系统,但是好像一个可以正常运转的整体;
对于任何共享系统,最多只能拥有其中两个特性。任两者的组合都有适用的场景,真实系统应该是ACID和BASE的混合体。
二阶段提交咋回事?
1、第一阶段(提交请求阶段)
协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。有时候,第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作。
2、第二阶段(提交执行阶段)
2.1成功
当协调者节点从所有参与者节点获得的相应消息都为"同意"时:
协调者节点向所有参与者节点发出"正式提交"的请求。
参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送"完了"消息。
协调者节点受到所有参与者节点反馈的"完了"消息后,完成事务。
2.2失败
如果任一参与者节点在第一阶段返回的响应消息为"中止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
协调者节点向所有参与者节点发出"回滚操作"的请求。
参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送"回滚完了"消息。
协调者节点受到所有参与者节点反馈的"回滚完了"消息后,取消事务。
有时候,第二阶段也被称作完成阶段,因为无论结果怎样,协调者都必须在此阶段结束当前事务。
3、二阶段提交的缺点
二阶段提交算法的最大缺点就在于 它的执行过程中间,节点都处于阻塞状态。即节点之间在等待对方的相应消息时,它将什么也做不了。特别是,当一个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占有的资源时,这个节点也将连带陷入阻塞状态。
另外,协调者节点指示参与者节点进行提交等操作时,如有参与者节点出现了崩溃等情况而导致协调者始终无法获取所有参与者的响应信息,这是协调者将只能依赖协调者自身的超时机制来生效。但往往超时机制生效时,协调者都会指示参与者进行回滚操作。这样的策略显得比较保守。
分布式事务的XA协议?
XA协议是由X/Open组织提出的分布式事务处理的规范,主要定义了事务管理器和局部资源管理器之间的界面,目前Oracle、db2等各大数据库厂商都提供对XA的支持,XA协议采用二阶段提交来管理分布式事务。
本地事务是咋回事?
事务有资源管理器(例如DBMS)本地管理。
优点是支持ACID特性,高效,可靠,应用系统编程简单。
缺点是不支持分布式环境,隔离的最小单位有资源管理器决定,例如数据库的一行记录。
spring的事务模板(模板方法回调)
最佳实践
1、基于消息的最终一致性
消息系统提供两个方面的支持,一个是发送消息提供事务支持,另外一个就是发送成功的消息保证投递成功,这样就可以借助消息系统来实现系统的最终一致性
2、系统幂等操作
重复调用多次产生的业务结果与调用一次产生的业务结果相同。
实现方式一个是业务操作本身实现幂等,二是系统缓存请求与处理结果,检测到重复请求之后,自动返回之前的结果。
3、事务补偿机制
http://iamzhongyong.iteye.com/blog/2076896