文章有点长,我决定用半个小时来和你分享~?废话不多说,上代码。。。基于Seata1.5.2,项目中用seata-spring-boot-starter1.SeataDataSourceAutoConfigurationSeataDataSourceAutoConfiguration主要是配置数据源代理,可以看到:默认seata.enabled、seata.enableAutoDataSourceProxy、seata.enable-auto-data-source-proxy都是true只有当classpath中有DataSource时才会进行此配置创建了一个SeataAutoDataSour
文章有点长,我决定用半个小时来和你分享~?废话不多说,上代码。。。基于Seata1.5.2,项目中用seata-spring-boot-starter1.SeataDataSourceAutoConfigurationSeataDataSourceAutoConfiguration主要是配置数据源代理,可以看到:默认seata.enabled、seata.enableAutoDataSourceProxy、seata.enable-auto-data-source-proxy都是true只有当classpath中有DataSource时才会进行此配置创建了一个SeataAutoDataSour
Seata包括Server端和Client端。Seata中有三种角色:TC、TM、RM,其中,Server端就是TC,TM和RM属Client端。Client端的源码学习上一篇已讲过,详见《Seata1.5.2源码学习》,今天来学习Server端的源码。源码下载地址:https://github.com/seata/seata启动类ServerApplication没什么好说的,重点是ServerRunnerServerRunner是一个CommandLineRunner实例,因此在SpringBoot启动完成后会回调其run()方法。而在ServerRunner的run()方法中调用了Ser
Seata包括Server端和Client端。Seata中有三种角色:TC、TM、RM,其中,Server端就是TC,TM和RM属Client端。Client端的源码学习上一篇已讲过,详见《Seata1.5.2源码学习》,今天来学习Server端的源码。源码下载地址:https://github.com/seata/seata启动类ServerApplication没什么好说的,重点是ServerRunnerServerRunner是一个CommandLineRunner实例,因此在SpringBoot启动完成后会回调其run()方法。而在ServerRunner的run()方法中调用了Ser
在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点,还得从GlobalTransactionScanner说起。启动的时候,会调用GlobalTransactionScanner#initClient()方法,在initClient()中初始化TM和RMTM初始化,主要是注册各种处理器,最终构造一个处理器映射表,不再多说HashMap>processorTable=newHashMap(32);重点关注RM初始化RM初始化过程中,设置了resourceManager和transact
在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点,还得从GlobalTransactionScanner说起。启动的时候,会调用GlobalTransactionScanner#initClient()方法,在initClient()中初始化TM和RMTM初始化,主要是注册各种处理器,最终构造一个处理器映射表,不再多说HashMap>processorTable=newHashMap(32);重点关注RM初始化RM初始化过程中,设置了resourceManager和transact
顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。使用子流程确实有一些限制:一个子流程只能有一个none类型的启动事件,不允许有其他类型的启动事件。一个子流程必须至少有一个结束事件。(请注意,BPMN2.0规范允许在子流程中省略开始和结束事件,但当前的Activiti实现不支持这一点。)顺序流(顺序流是流程的两个元素之间的连接器,说白了就是流程图中的连线)不能跨越子流程边界。考虑下面这个流程图用多实例子流程实现了类似会签的功能。(当然了,不用子流程,用多实例任务也能实现会签功能。)上面这个流程会根据传入的人数来决定开启几个子流程,在每
顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。使用子流程确实有一些限制:一个子流程只能有一个none类型的启动事件,不允许有其他类型的启动事件。一个子流程必须至少有一个结束事件。(请注意,BPMN2.0规范允许在子流程中省略开始和结束事件,但当前的Activiti实现不支持这一点。)顺序流(顺序流是流程的两个元素之间的连接器,说白了就是流程图中的连线)不能跨越子流程边界。考虑下面这个流程图用多实例子流程实现了类似会签的功能。(当然了,不用子流程,用多实例任务也能实现会签功能。)上面这个流程会根据传入的人数来决定开启几个子流程,在每
Spring提供的事务使用起来很方便,一个@Transactional注解就搞定全部,但是如果不注意,也会踩坑提到事务就应该想到至少以下几点:1、在事务方法中加锁,可能会导致锁失效无论是Java自带的锁,还是分布式锁,都有可能出现没锁住的情况原因是解锁先于事务提交,一旦锁释放后其它线程就可以获取到锁了,由于事务还没提交,所以新线程读到的还是旧数据(跟前一个线程读取到的数据是一样的),这就相当于多个线程做了一模一样的事情了。正确的做法是:要么别加事务,要么把锁加在事务方法外面2、调用内部(同一个类中)方法的话,事务不会生效3、事务方法被声明成private或者final,导致事务不生效4、声明回
Spring提供的事务使用起来很方便,一个@Transactional注解就搞定全部,但是如果不注意,也会踩坑提到事务就应该想到至少以下几点:1、在事务方法中加锁,可能会导致锁失效无论是Java自带的锁,还是分布式锁,都有可能出现没锁住的情况原因是解锁先于事务提交,一旦锁释放后其它线程就可以获取到锁了,由于事务还没提交,所以新线程读到的还是旧数据(跟前一个线程读取到的数据是一样的),这就相当于多个线程做了一模一样的事情了。正确的做法是:要么别加事务,要么把锁加在事务方法外面2、调用内部(同一个类中)方法的话,事务不会生效3、事务方法被声明成private或者final,导致事务不生效4、声明回