「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
-
TCC协议其实也就是三段提交只不过有些微不同:
-
try还是先查询是否可以执行
-
但所有的服务try都返回ok的时候,事务协调器发送confirm请求,大家开始执行事务,在各自的confirm中提交事务。
-
如果有一个服务失败了。事务协调器调用每个服务器的cancle,来恢复原来的状态。
其实就是把回滚操作抽出来了一个cancle接口,是要程序员手写sql的,try也要写代码sql实现。。
-
缺点就是要写很多业务代码,try,cancle都要写。
4. MQ来实现事务
rocketMQ支持事务消息,kafka和activeMQ不支持但是可以通过他们的ack来实现,这个后面讲:
- 一个服务要执行事务之前,先给RoMQ发送一个propare信息(这个消息是不不能被消费的),然后直接执行事务,但不提交,执行完以后发送confirm消息给消息队列。
- 这个时候消费者会消费到这条消息,然后开始执行他自己的事务,返回ack结果(可能是失败的也可能是成功的消息,消费成功与否)。如果消费失败,当你订单服务挂了,重新连接的时候会重新去消费那条消息。
- 最后商品服务根据ROMQ的结果是提交还是回滚。
-
分布式锁-学习redis实现和zookeeper实现
分布式锁具有的条件:非阻塞的,单个服务可重入的,可以实现公平与非公平锁。
-
redis实现分布式锁:
关键方法:(记住有个超时的设置)
- setnx(); setnx(key,value) 如果key不存在,那么设置当前key的值为value,返回1,如果存在就返回0。
- expire(),设置key的有效时限senx 不能直接设置有效时间,只能通过exprie(). 是为了防止,如果程序崩溃了,这个锁一直存在 (释放锁是通过删除key就行了)。所以设置一个过期时间,自动释放。这个是redis自己控制的过期时间。
- getset(key,value) 往里面设置值的时候,如果成功就返回旧值,如果第一次的话是返回null。这个用于程序自己控制过期时间, 防止我的业务还没执行完,你的所要失效了,通过getset方法来演唱失效时间。
-