分布式事务及相关问题的解决

本地事务在分布式下的问题

分布式事务及相关问题的解决_第1张图片

创建订单锁库存过程中出现两个问题:

本地事务在分布式系统中,只能控制住自己的回滚,控制不了其他服务的回滚

分布式事务最大的原因就是网络问题+分布式机器 不操作一个数据库

本地事务隔离级别&传播行为等复习

分布式事务及相关问题的解决_第2张图片

分布式事务及相关问题的解决_第3张图片

一个事务开始代表下面的所有操作都在同一个连接里面

分布式事务及相关问题的解决_第4张图片

分布式事务及相关问题的解决_第5张图片

分布式事务及相关问题的解决_第6张图片

分布式事务及相关问题的解决_第7张图片

分布式事务及相关问题的解决_第8张图片

分布式事务及相关问题的解决_第9张图片

本地事务失效的问题:

同一个对象内事务方法互调默认失效,原因是绕过了代理对象,事务是使用代理对象来控制的

解决:使用代理对象来调用事务方法

1、引入AOP模块,引入了Aspectj

2、开启Aspect J动态代理  @EnableAspectJAutoProxy (exposeProxy=true)    以后所有的动态代理都是Aspect J创建的,即使没有接口也可以代理;(exposeProxy=true)作用是堆外暴露代理对象

3、用代理对象来点用就行

分布式事务及相关问题的解决_第10张图片

分布式事务-分布式CAP&Raft原理

分布式事务及相关问题的解决_第11张图片

分布式事务及相关问题的解决_第12张图片

Raft实现分布式系统一致性

原理:核心就是领导选举(节点自选时间,确定是否要成为候选人)和日志同步(心跳时间),几十出现分区错误也能保证一致性

分布式事务及相关问题的解决_第13张图片

分布式事务及相关问题的解决_第14张图片

分布式事务及相关问题的解决_第15张图片

分布式事务常见解决方案

分布式事务及相关问题的解决_第16张图片

分布式事务及相关问题的解决_第17张图片

分布式事务及相关问题的解决_第18张图片

分布式事务及相关问题的解决_第19张图片

分布式事务及相关问题的解决_第20张图片

分布式事务及相关问题的解决_第21张图片

Seata分布式事务:默认使用的是AT模式

分布式事务及相关问题的解决_第22张图片

3、所有想要用到分布式事务的微服务使用seata DataSourceProxy代理自己的数据源

@Configuration
public class MySeataConfig {

   @Autowired
    DataSourceProperties dataSourceProperties;

    @Bean
   public DataSource dataSource(DataSourceProperties dataSourceProperties){
       HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
        if(StringUtils.hasText(dataSourceProperties.getName())){
            dataSource.setPoolName(dataSourceProperties.getName());
      }
       return new DataSourceProxy(dataSource);
    }
}

4、每个微服务必须导入registry.conf和file.conf

分布式事务及相关问题的解决_第23张图片

注意:高亮部分要写各个微服务的名称

5、启动测试分布式事务

6、分布式大事务入口标@GlobalTransactional注解,开启全局事务

7、每一个远程的小事务用@Transactional

指定注册中心:

分布式事务及相关问题的解决_第24张图片

注:启动之前要保证nacos启动

以上方案并不适用于高并发场景,像库存等高并发服务采用可靠消息+最终一致性方案

 

 

你可能感兴趣的:(分布式事务及相关问题的解决)