可以挣钱的网站,手机网站开发软件下载,为什么浏览器打不开一些网站,flash网站引导页大家好#xff0c;我是想想。
很久没有给大家分享技术了#xff0c;主要在计划一些事情#xff0c;几乎没什么时间爽文了。
今天从实操上实现了MySQL事务隔离复现问题#xff0c;就记录分享给大家吧。
正文
我们知道#xff0c;著名的四大事务特性ACID特性
Atomicity…
大家好我是想想。
很久没有给大家分享技术了主要在计划一些事情几乎没什么时间爽文了。
今天从实操上实现了MySQL事务隔离复现问题就记录分享给大家吧。
正文
我们知道著名的四大事务特性ACID特性
Atomicity 原子Isolation 隔离Durability 持久Consistency 一致
在并发事务过程中我们总是会考虑到 隔离性 我们可以很轻松的通过查阅资料发现分别有这4个不同的隔离级别
读未提交读已提交可重复读串行化
我们知道有这四种隔离等级从上至下越发安全性能也越发下降。但是他们怎么在真实场景下展示出来呢
下面演示
隔离级别控制
-- 查询数据库事务隔离级别
select variables like tx_isolation;
select tx_isolation;我们知道 MySQL 默认的是 REPEATABLE-READ 可重复读
读未提交
set global tx_isolationREAD-UNCOMMITTED;
-- 全局提交提交完重新连接一下
set tx_isolationREAD-UNCOMMITTED;
-- 当前客户端提交不需要重连重连之后就失效了两种都可
mysql select tx_isolation;
------------------
| tx_isolation |
------------------
| READ-UNCOMMITTED |
------------------在读未提交的情况下可能会发生脏读、不可重复读、提交覆盖、幻读
初始化表
CREATE TABLE hello (id int(11) NOT NULL,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)
)创建两个客户端
脏读复现 同时开启事务一个客户端update 但不提交另一个客户端也可以查询到
这是脏读了当然了这两次读取都不一样也满足了不可重复读这种情况。
读已提交
mysql select tx_isolation;
----------------
| tx_isolation |
----------------
| READ-COMMITTED |脏读问题解决 重复操作发现读已提交 这个级别已经可以避免脏读、Oracle、SQL Server 默认就是这个隔离级别
但是这样依旧会发生 不可重复读、幻读
不可重复读复现 这种在一个客户端内第二次读取数据发现变化的情况就是 不可重复读
那要如何解决呢 修改为 可重复读 级别
可重复读
mysql select tx_isolation;
-----------------
| tx_isolation |
-----------------
| REPEATABLE-READ |
-----------------不可重复读解决 通过将隔离级别修改为 可重复读发现不可重复读这个问题就已经解决啦
但是还是可能会出现 幻读 的情况
幻读复现
幻读指的是两次读取中间被其他事物插入了
我们模拟一下 我没发现并没有像理论那样右边的事务查询到了更多的数据 原因是MySQL 引入了间隙锁、范围锁这种概念解决了这种情况。 我们再往下看 间隙锁、范围锁 还是没办法解决这个问题。
串行化
自己去测试吧
最后给大家带来一个面试题 事务隔离级别和锁的关系