分布式事务的定义和理解

分布式事务是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)

易误区:

例如,一个java进程,操作多个数据库,如redis,mysql等,虽然他们每个数据库都有自己的事务,但是我们也可以把对他们的操作放到一个java进程事务当中进行管理。

这不算分布式事务。分布式事务是要两个不同的java进程的操作一直所以一个事务进行原子性操作。

解答疑惑:一个java进程,操作多个数据库,如redis,mysql等,虽然他们在同一个java进程,但是他们都有自己的数据库事务,所以这属于分布式事务。

分布式事务:一种是强一致性(成功就完事,失败就回滚);另一种是最终一致性,如RocketMQ,如果是网络或者IO问题,MQ可以采取重试操作,努力达到事务最终的一致性;如果是逻辑问题,消费者因为逻辑问题消费失败进行了相应的回滚,然后它又想回滚生产者的事务,其实是无法自动做到的,只能通过后续的补偿,补丁修复了。

 RPC模式与MQ模式的区别,RPC模式其实是请求应答模式,MQ模式就是只请求不响应模式。

如果两个系统只是一些rpc远程调用,其中调用方本地的事务自己可以控制,但是被调用方事务要想回滚是无法做到的,可以通过支持事务的MQ进行补偿,补丁被调用方系统的数据。或者http补偿接口不断重试补偿,直到补偿事务执行成功为止。

如果多个系统之间调用采用rpc,mq(支持事务)混合,又有嵌套,如一个系统既是mq中的消费者,又是另外一个系统mq的生产者这种链路,消费中又有rpc调用。这种情况是不做分布式事务强一致性的,只做分布式事务最终一致性。尽可能保证系统的mq消息正常的消费,正常的发送mq消息,不回滚代码,rpc调用由于网络,IO原因,程序异常代码等等,暂时记录下来,不阻碍程序往下走,后续通过补偿这些,达到事务最终一致性就可以了。

原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12445560.html