SERIALIZABLE 隔离级别的疑问

来源:9-14 【实战】 事务阻塞的捕获

Anthony_Duan

2019-08-11

我这里有个需求,一张表有复合唯一索引,还有一列名为 value 为数值型,根据复合索引查,如果查询到了,那么就更新value 值为原来的 value+1 如果没有查询到,就插且 value 为 1. web业务。
我想到的解决方案是 用 for update 行锁 第一次查的时候加上 for update 这样别人就无法读了。自然也无法更新。插入也不受影响,其他索引也受到影响。
今天看到了 SERIALIZABLE 这个隔离级别,但是我实验了下,一个 session 查询查询一条数据未提交事务时,另外的 session 依旧可以查到该数据。这个不是串行的吗?还是我对这个串行理解有错误?

写回答

2回答

Anthony_Duan

提问者

2019-08-12

mysql 为 5.7

数据库连接工具为 DataGrip

打开控制台1 输入语句

//img.mukewang.com/szimg/5d5145ae09befd7308110375.jpg

再打开控制台 2 输入语句

//img.mukewang.com/szimg/5d5145c209572d6a08880395.jpg

执行控制台 1 的语句 正确查询出结果

//img.mukewang.com/szimg/5d51460c096c16fc08720247.jpg

再执行控制台 2 

//img1.sycdn.imooc.com/szimg/5d51462f0964e9c608470358.jpg

同样得出正确结果,

但是此时如果控制台 2 执行 update 语句会被阻塞

由此我觉得SERIALIZABLE 对读是不会串行化处理的。

这个结论是对的吗?还是我实验哪里有问题了?


0
0

sqlercn

2019-08-12

可以说一下你的试验过程吗

0
4
sqlercn
回复
Anthony_Duan
在读上面加锁就用for update 从句就可以了
2019-08-14
共4条回复

零基础入门 详解企业主流数据库MySQL8.0

掌握SQL优化与慢查询优化,具备独当一面的能力

1641 学习 · 485 问题

查看课程