事务是有很多原子性的操作组成的,他要么全部执行成功,要么全部执行失败,在分布式系统中为了实现这个目标,各大厂商出现了很多种不同的解决方案。一些软件公司和外包公司还在使用基于二阶段提交协议的解决方案,但是一些主流的互联网公司主要是用mq等解决方案,像蚂蚁金服使用的是基于TCC的解决方案。
二阶段提交协议
二阶段提交协议其实很好理解,分为两步走,第一步执行sql但不提交,等该事务的sql全部执行成功之后,执行第二步,提交sql,否则执行数据库的回滚操作。但是这个为什么说现在主要在一些软件公司或者外包公司还在使用,一些互联网公司或者大厂不会去使用它呢,最重要的一点是他的效率太低,当数据访问量太大时,会造成线程等待情况太严重。
也正是由于基于二阶段提交协议的解决方案效率太低,他被使用在只注重产能的软件公司和外包公司。下面来讲讲他为什么效率低。基于该协议实现的框架有很多,这些框架在实现的时候为了能保证事务的一致性,必须要对数据库资源上锁,如果不上锁,该协议没有任何意义,所以就造成了一个线程中的事物为了保证事物的一致性,必须对数据库资源上锁,那么其他线程就必须等待,一直到该线程释放锁才可以让其他线程中的一个使用。
所以基于二阶段提交协议的分布式事务-水平分库的解决方案正在被抛弃,他不适合于现在数据访问量达到一定量级的互联网公司。在下一篇文章中我将介绍蚂蚁金服在分布式事务-水平分库中使用TCC的解决方案。
对于分布式事务没有任何一家公司能100%解决,只能在一定程度上降低概率,像蚂蚁金服的解决方案能达到99.99%,所以说当出现分布式事务的情况,我们可以记log,让定时任务去跑,必要时还需要人工修数据。