1.前言
同样另外一个非常有意思的题目,值得我们思考。大概背景是这个样子的。如果有一个事务A进行插入 id > 100, 同时另外一个事务B进行更新update id > 100。那么事务B是否会更新成功。我们来画一个时序图:
time | 事务A | 事务B | 备注 |
---|---|---|---|
T1 | insert id > 100 set status = 1 | ||
T2 | update id > 100 set status = 2 | ||
T3 | 最后id > 100 status是为1 还是为2呢 |
2.代码
我们从事务的四个隔离性来分别讨论这个问题。所有代码如下,仅仅是隔离性级别修改。修改是status状态。
以下所有操作类似于打开两个浏览器,首先请求事务A,事务A执行过程中,在请求事务B,观察结果。
- 事务A 进行插入
@RequestMapping("/test/publish/submit")
public String testPublish1() {
log.info("start...");
transactionTemplate.execute(new TransactionCallback<String>() {
@Override
public String doInTransaction(TransactionStatus status) {
for (long i