1、什么是分布式事务

    在越来越复杂的系统中,最后都无可避免的需要进行分库分表(常见按业务模块划分)。若在处理同一个业务时,需要用到两个不同的服务时,这时传统的事务管理就无法同时管理到两边数据库的事务了,应运而生分布式事务来解决这一难题。

2、分布式事务解决方案

  •    基于XA协议

主要是基于两阶段提交——准备阶段和提交阶段,其中还涉及到第三方事务协调者(transaction manager)来协调各个资源管理器的事务提交(数据库或JMS队列)

缺陷:
        1、性能低下,一般为本地事务的1/10
        2、单点故障:TM是个单点。
        3、事务状态丢失:即使把TM做成一个双机热备的,一个TM挂了自动选举其他的TM出来,但是如果TM挂掉的同时,接收到commit消息的某个库也挂了,此时即使重新选举了其他的TM,根本不知道这个分布式事务当前的状态,因为不知道哪个库接收过commit消息,哪个接收过commit消息的库也挂了。
        4、脑裂问题:在阶段二中,如果发生了脑裂问题,那么就会导致某些数据库没有接收到commit消息,有些库收到了commit消息。

此外还有一个三阶段提交协议,2PC的改进版,其将二阶段提交协议的"提交事务请求"过程一分为二,形成了CanCommit(确认数据库环境正常)、PreCommit(完成sql语句的操作,但未提交事务)和do Commit(通知所有库提交/回滚事务)三个阶段组成的事务处理协议。

优点 :引入超时机制,降低了协调者与参与者之间的阻塞范围;

缺点:在参与者接收到preCommit之后,如果出现网络分区,那么该参与者节点会继续执行事务的提交,而其他节点会执行中断事务,最终会造成数据的不一致。

事务管理器实现原理:

   创建分布式事务的时候,创建一个代表了分布式事务的对象。在各个SQL执行的时候,必须从 自定义的DataSource里面获取Connection,对Connection的prepareStatement()方法的调用,需要进行拦截,去对各个库执行XA START指令,以及定义好SQL;在提交事务的时候,需要去对各个库执行XA PREPARE指令,如果都成功,就执行XA COMMIT指令,如果失败,就执行XA ROLLBACK指令。