Seata分布式
昨日回顾 Seata 中AT模式 1、TM先TC注册一个全局事务ID,把这个XID在服务链路中传递 2、RM被调用后先向TC做一个本地事务的分支注册,和XID存在关系 3、记录undo_log表的数据,然后执行本地事务,向TC反馈本地事务的执行结果 4、最终由TC发送最终的提交 Seata中TCC模式 1、远程调用预处理的方法的时候先给冻结100 2、然后继续处理业务 3、如果全部处理成功,调用远程的commit方法,取消解冻,然后扣减 4、如果由一个失败,调用远程的rollback方法,取消解冻 锁类型 悲观锁:在修改数据之前会加锁 乐观锁:在修改时间的时候不会加锁,在提交的时候回做一个判断。ABA的问题通过一个版本号来解决(CAS) Java中锁 同步锁:Java关键字,自动加锁,自动释放锁,没有锁中断,重量级(需要操作系统支持)。 LOCK:JDK提供的一个接口,手动加锁,手动释放,有锁中断机制,轻量级。 加锁锁的是对象,不是代码。 线程可见性 1、什么是线程可见性? 多个线程操作同一个资源同事,一个线程修改了资源,另一个线程拿不到最新的数据,所以两个线程之间是不可见的。 2、什么原因的导致的? JMM,主内存,work内存。 3、如何解决 voliate关键字,加锁 今日内容 画图 https://www.processon.com/view/link/655ea22493553315d1117a11 抢购 总过有10件商品,卖出一件商品应该创建一个订单,卖完的数量库存为0,订单为10。 package com.ts.day23lock01native.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController @RequestMapping("/native") public class NativeSynController { @Autowired private StringRedisTemplate redisTemplate; private String stockKey = "seckill:%s:stock"; private String orderKey = "seckill:%s:order"; @PostConstruct // method-init public void init() { redisTemplate....