`
flyzonemu
  • 浏览: 34417 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

支付宝分布式事务初探

阅读更多
  最近有被人问到分布式事务的工作原理,由于从来没做过这方面的东西,只能胡乱猜测一番,结果当然是凌乱无比。

  刚好今天有支付宝的高手来分享支付宝的分布式事务。跑去听了一下,果然大有收获。在这里把今天听到的总结一下,也算是份课堂笔记吧!
 
  分布式事务,这个东西多半都是用在金融相关的系统上,应用的场景往往是多系统跨库。
  相关的业务对事务的一致性要求很高,涉及到钱的东西当然分毫不能有差。
  那么怎么来处理这些系统之间的事务。保证事务的一致性,原子性,持久性,隔离性呢?
 
  举个例子,支付宝有交易系统、账户系统、积分系统等多个子系统。
  当客户发起一笔交易时,需先在交易系统中插入交易记录,然后在账户系统中进行金额的增减,最后在积分系统中给加上最新的积分。
  实际的业务比这个更复杂。这三部中有任何一步失败,都需要进行回滚。那么怎么保证这三个事务会进行回滚呢?
 
  支付宝使用的是一个二段式的分布式事务
  第一阶段,通知各子系统进行业务的操作,比如可以在交易系统中对交易记录表拷贝一个副表,在副表中插入交易记录。如果执行成功,子系统返回成功的信息
 
   在这个中间还有一个很重要的角色就是有一个总调度者,他负责控制整个事务的流程。发起事务时首先要注册到调度者上,事务完成,或者回滚也是由调度者发起!

   接着上面的继续,当子系统第一阶段业务执行成功,返回成功给调度者,如果所有子系统都返回成功信息,者调度者通知子系统进行第二阶段的操作,讲数据插入主表中,如果有任何一个子系统返回失败的消息,则通知所有系统回滚。

   这是一个理想的状态,前提是每次业务操作都会完成,这样事务的一致性就可以保证,但是实际情况不是这样,比如服务器宕机,网络断掉等,会导致某一阶段不能完成
  
   这样会导致事务的不完整,所以我们还需要一个清道夫式的角色,来保证系统中事务的完整。实际上我们可以创建一个定时钟,定时去扫描所有的事务,遇到超时,或者不完整的事务,一律通知各子系统进行回滚,这样虽然有可能会导致误杀一些执行时间过长的事务,但是却保证了整个系统的事务一致,所以还是值得的。
  
   大致原理就是如此,具体的实现方式还是有很多技巧性的东西,在这里就不深入探讨了。
分享到:
评论
1 楼 ifuleyou49 2014-03-09  
这个副表拷贝是指什么意思呢

http://me.kimiazhu.info/post/web-dev/a-simple-design-of-distributed-transaction-system.html

这里这种做法貌似只要一个标志位,而且第二阶段的“提交”也可以免了的

相关推荐

Global site tag (gtag.js) - Google Analytics