分布式解决选择
分布式锁一般有三种实现方式:
1、数据库锁
最简单的方式可能就是直接创建一张锁表,然后通过操作该表中的数据来实现了
要锁住某个方法或资源时,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录
2、基于Redis的分布式锁
基于缓存来实现、可以集群部署
使用jedis.setnx()和jedis.expire()组合实现加锁
3、基于ZooKeeper的分布式锁
基于zookeeper临时有序节点可以实现的分布式锁 (对应的方法临时有序结点)
每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。
判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。
当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。
分布式事物;
1、XA 是一个两阶段提交协议:
第一阶段:事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.
第二阶段:事务协调器要求每个数据库提交数据。
2、补偿事务(TCC)
都要注册一个与其对应的确认和补偿(撤销)操作
Try :阶段主要是对业务系统做检测及资源预留
Confirm: 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。
即:只要Try成功,Confirm一定成功
Cancel: 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放