数据表:create table stuinfo(id int,age int);
insert into stuinfo values(1,2),(2,2),(2,3)
并发的问题~对于两个事务T1,T2。
脏读: T1读取了已经被T2更新但还没有被提交的字段,若T2回滚,T1读取的内容就是临时且无效的
不可重复读: T1读取了一个字段,然后T2更新了该字段,T1再次读取同一个字段,值就不同了
幻读: T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后T1再次读取同一个表就会多出几行
第一步,打开管理员的命令CMD,重启Mysql
- net stop mysql # 关闭mysql
- net start mysql # 打开mysql
第二步,验证第一种情况read uncommitted,打开两个cmd的窗口,分别有如下设置
设置当前的两个默认的会话窗口都为read uncommitted
且都set autocommit=0;# 将提交修改为用commite提交
set session transaction isolation level read uncommitted; #将其会话窗口设置为read uncommitted
然后两个窗口都得设置上 set autocommit=0; # 使得不是提交后数据库里面的数据就被确定修改
start transaction;#启动事务,两个窗口都要
对于隔离级别的"READ UNCOMMITED "并发的三种问题都会出现
第三步,验证第二种情况read committed,打开两个cmd的窗口,分别有如下设置
set session transaction isolation level read committed; #将其会话窗口设置为read committed
解决了脏读,却解决不了重复读和幻读
第四步,验证第三种情况repeatable read 打开两个cmd的窗口,分别有如下设置
set session transaction isolation level repeatable read; #将其会话窗口设置为repeatable read
解决了脏读,重复读,却解决不了幻读
第五步,验证第四种情况serializable打开两个cmd的窗口,分别有如下设置
set session transaction isolation level serializable; #将其会话窗口设置为 serializable
脏读,重复读,幻读都被解决了
脏读 不可重复读 幻读
read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable: × × ×