标题名称有点长,因为不太好描述今天所分享的内容。今天这篇的目的有两个:
1. 在事件中,处于不同的阶段,使用不同的API进行数据操作。
2. 从侧面验证上一篇文章《Flowable6.4 - 事件,事务》的结论。
如果事件包裹在事务内,即:
@Overridepublic boolean isFireOnTransactionLifecycleEvent() { return false;}
如果使用createXXXXQu...
Flowable6.4 – 事件,事务
最近有个需求,假设流程节点都是同步的,在UserTask创建完成后,推送一条企业微信消息。
需求很简单,实现上也没有什么难度,但是在实现FlowableEventListener这个接口的时候,发现和事务有所联系。
然后,很自然的想到一个问题:这个事件的触发到底是在事务提交之后,还是在事务提交之前。如果在事务提交之前触发了事件,事务提交时又失败回滚,这条发出的消息岂不是无用的。
所以,我又去翻了...
Flowable6.4 – 分布式事务
本文是基于SpringBoot、Atomikos、MyBatis、Druid实现的,全文总共分为两大部分:
介绍一下SpringBoot如何基于Atomikos实现分布式事务。介绍一下Flowable如何实现分布式事务。
首先,介绍一下SpringBoot如何实现分布式事务。
Jar包的主要引用如下:
<dependency> <groupId>org.springframework.boot</groupId> ...
Flowable6.4 – 数据库访问及事务处理
最近我对于Flowable的数据库访问过程很感兴趣,所以去阅读了一下这块的源码,大概梳理了一下。
直接从ProcessEngineConfigurationImpl内的init()方法作为切入点,跟踪其内部调用的initCommandExecutors()方法。
如果阅读过之前我写的源码分析文章,就可以知道Flowable是基于命令链来实现各种业务逻辑的,也可以知道initCommandExecutors()这个方法其实就是命令链的初始化方法。
着重关注一下get...
Spring编程式事务
我们经常用到的Spring事务声明方式是:
使用AOP切面声明事务。使用注解@Transactional声明事务。
这次试验一下另外一种事务实现方式:编程式事务。
以SpringBoot项目为例,使用以下代码声明事务:
@Primary@Bean(name = "transactionManager")public DataSourceTransactionManager getDataSourceTransactionManager(@Qualifier("dataSource")DataSource dataSource)...
MySQL-死锁
本文基于MySQL的数据库引擎InnoDB,通过本文了解:
1. 死锁。
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。以下是一些示例。
更新时互相等待
#第一个事务
START TRANSACTION;
#第一步,更新1111这条数据
UPDATE test2 SET sum_count = sum_count + 1 WHERE id = '1111';
#第三步,更新2222这条数据
UPDATE test2 SET sum_count = sum_count + 1 WHE...
MySQL-幻读
本文基于MySQL的数据库引擎InnoDB,通过本文了解:
1. 幻读:在一个事务的两次查询中数据不一致。
上一篇了解了MySQL的不可重复读,但是有时候同一个事务中,前后两次查询显示数据有可能是不一致的,以下就为示例:
更新了其它事务中新增数据:
#第一个事务
START TRANSACTION;
#第一步,第二个事务插入前查询
SELECT * FROM test2;
#第五步,第二个事务插入后查询
SELECT * FROM test2;
#第六步,更新第...
MySQL-可重复读
本文基于MySQL的数据库引擎InnoDB,通过本文了解:
1. 可重复读。
首先,要了解的是,MySQL的事务默认隔离级别是:可重复读,即:在事务执行期间会锁定该事务以任何方式引用的所有行。
其它事务做更新时:
#第一个事务
START TRANSACTION;
#第一步,第二个事务更新前查询
SELECT * FROM test2;
#第四步,第二个事务更新后查询
SELECT * FROM test2;
#第六步,第二个事务提交后查询
SELECT * FROM test2;
...