目录
前言
MySQL有四种不同的隔离级别:read-uncommit、read-commit、repeatable-read和serializable,这四种隔离级别分别解决了不同的数据一致性问题,也存在不同的问题,为了验证这些问题,我做了以下实验。
实验目的:
认识四种隔离级别分别存在的不同问题
实验步骤:
- 查看当前数据库的隔离级别
- 通过配置文件修改隔离级别
- 创建两个线程来进行本实验
实验过程、总结:
1.查看当前数据库的隔离级别
select @@变量名; 或者show variables like '变量名';
2.通过配置文件修改隔离级别
(1)修改为read-uncommitted读未提交级别:
(2)修改为read-committed读已提交级别:
(3)修改为repeatable-read读已提交级别:
(4)修改为serializable串行化级别:
3.创建两个线程来进行本实验
(1)验证读未提交(READ-UNCOMMITTED):
<1>创建基表(第一线程)
<2>启动事务并查表(第一线程、第二线程)
<3>更新数据 (第二线程)
更新数据但是并未提交commit
<4>再次查表(第一线程)
可是此时第一线程却出现了脏数据
(2)验证读已提交(READ-COMMITTED):
<1>启动事务并查表(第一线程、第二线程)
<2>更新数据(第二线程)
第二线程
<3>再次查表(第一线程)
此时第二线程还未commit,第一线程再次查表时不会出现脏数据,这就解决了事务隔离中读未提交出现的脏读情况
但是如果第二线程提交,第一线程就会出现幻读、不可重复读的情况
(3)验证可重复读(REPEATABLE-READ):
<1>启动事务并查表(第一线程、第二线程)
<2>更新数据未提交(第二线程)
第二线程(未提交)
第二线程(已提交)
<3>再次查表(第一线程)
从下面的结果可以看出无论第二线程提交或者未提交,第一线程都没有出现脏读和幻读的情况
第二线程(未提交查表)
第二线程(已提交查表)
当第一线程commit后再次查表时才会更新数据
<4>再次更新、查看操作(第一线程、第二线程)
第二线程进行更新并提交
第一线程进行查看并更新提交
第二线程再进行查看
此时第二进程查看自己刚刚更新的num=400的数据时会突然变为第一线程更新的500,所以第二线程就出现了更新丢失的情况
(4)验证可重复读(SERIALIZABLE):
该进程下虽然可以解决前面三种出现的问题,但是在效率上对比其他的较低