mysql之TCL--事物隔离级别--演示

mysql之TCL–事物隔离级别–演示

set autocommit=0,
当前session禁用自动提交事物,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务。

mysql之TCL--事物隔离级别--演示
数据库的隔离级别:
同时运行多个事物,访问数据库中相同数据,没有采取必要的隔离机制,就会导致各种并发问题
类似多线程的线程安全,五个人同时上一个厕所,所以要启用加锁的方式,实现线程同步,解决

脏读:两个事物:t1、t2,t2更新还没提交的字段被t1读取了,t1读到的内容就是临时无效的
例如:被记者曝光我以后的财富,上一秒一万个亿,其实我已经有两万个亿了。更新

不可重复读:对于两个事物t1、t2,t1读取了一个字段,t2更新了,t1再次读取同一个字段,值不同
例如:网卡了查询余额,开始有1000后来只有500。修改

幻读:对于两个事物t1、t2,t1从一个表中取出一个字段,t2插入一些数据之后,t1再读多出几行
例如:三行变五行。插入

可以通过设计

#1.停止MySQL
C:\WINDOWS\system32>net stop mysql
#2.启动MySQL
C:\WINDOWS\system32>net start mysql
#3.登录MySQL
C:\WINDOWS\system32>mysql -uroot -pROOT

#4.查看默认隔离级别
mysql> select @@tx_isolation
mysql之TCL--事物隔离级别--演示
#5.设置隔离级别为最低的:读未提交
mysql之TCL--事物隔离级别--演示
#6.重复第4步,查看默认级别
mysql之TCL--事物隔离级别--演示
#7.打开test库
mysql之TCL--事物隔离级别--演示
#8.查看表中数据
mysql之TCL--事物隔离级别--演示
#9.修改表中姓名列的字符集
set names gbk;//好像是因为name有多个所以要加s,用name报错
mysql之TCL--事物隔离级别--演示
#10.再去查看表中的数据
mysql之TCL--事物隔离级别--演示
#11.关闭事物
mysql之TCL--事物隔离级别--演示
#12.修改1号的名字

mysql之TCL--事物隔离级别--演示

这个时候事物开起了,没有结束语句,数据还在内存中没有提交到硬盘

#13.在开启一个cmd命令行

mysql之TCL--事物隔离级别--演示

#14.查看默认隔离级别
mysql之TCL--事物隔离级别--演示
#15.设置隔离级别为最低的,并查看
mysql之TCL--事物隔离级别--演示
#16.打开数据库,开启事物
mysql之TCL--事物隔离级别--演示
#17.查看account表的数据
mysql之TCL--事物隔离级别--演示
#18.设置字符集
mysql之TCL--事物隔离级别--演示
#19.再查看表中的数据
mysql之TCL--事物隔离级别--演示
这时候,张无忌的名字已经被改为John,实际上没有提交。这时候就把这种情况命名为:脏读

#20.事物回滚
mysql之TCL--事物隔离级别--演示
#21.再去查看
mysql之TCL--事物隔离级别--演示
这种显现被称为:不可重复读(结果不一样)


#设计事物隔离级别第2级别:读已提交
set session transaction isolation level read committed;
mysql之TCL--事物隔离级别--演示
#2.关闭事物
mysql之TCL--事物隔离级别--演示
#3.再去修改1的名字
mysql之TCL--事物隔离级别--演示
#提交事物结束上一个事物

#4.设置另一个事物的级别为二级
mysql之TCL--事物隔离级别--演示
#5.关闭事物
mysql之TCL--事物隔离级别--演示
#6.查询数据
mysql之TCL--事物隔离级别--演示
避免了脏读,不可重复读和幻读没有避免

#7.验证,提交事物
mysql之TCL--事物隔离级别--演示

#8.再查询两次结果不一样:不可重复读就出现了
mysql之TCL--事物隔离级别--演示
#9.提交结束事物
mysql之TCL--事物隔离级别--演示


#设计事物隔离级别第3级别:可重复读

set session transaction isolation level repeatable read;
mysql之TCL--事物隔离级别--演示
mysql之TCL--事物隔离级别--演示

#2.查看表中的数据
mysql之TCL--事物隔离级别--演示
#3.关闭事物
mysql之TCL--事物隔离级别--演示
#4.把张飞改为刘备
mysql之TCL--事物隔离级别--演示
#5.关闭事物
mysql之TCL--事物隔离级别--演示
#6.查看表中的数据
mysql之TCL--事物隔离级别--演示
发现:张飞没有变成刘备,避免了脏读

#7.提交
mysql之TCL--事物隔离级别--演示
#8.再查询
mysql之TCL--事物隔离级别--演示
#9.提交
mysql之TCL--事物隔离级别--演示
#10.关闭事物
mysql之TCL--事物隔离级别--演示
这时候才是最新的数据,这时候就解决了 脏读,不可重复读。幻读就没解决


幻读演示

#1.查询事物隔离级别
mysql之TCL--事物隔离级别--演示

#2.关闭自动提交事物
mysql之TCL--事物隔离级别--演示
#3.结束上一个事物,开启一个事物,查询原表的数据
mysql之TCL--事物隔离级别--演示
#4.插入一条数据
mysql之TCL--事物隔离级别--演示
#5.提交
mysql之TCL--事物隔离级别--演示
6.修改名字,发现三行受影响。这时候幻读就发生了
mysql之TCL--事物隔离级别--演示

事物隔离级别第4级别:串行化,性能非常低,慎用

最高隔离级别解决所有并发问题

set session transaction isolation level serializable;
mysql之TCL--事物隔离级别--演示
mysql之TCL--事物隔离级别--演示

#2.关闭一个事物,并查看表中的数据
mysql之TCL--事物隔离级别--演示
#3.开启,另一个事物,插入数据。这时没有反映
mysql之TCL--事物隔离级别--演示

像java的多线程,阻塞了,被锁在外面了。无法对数据进行操作

这边修改完毕
mysql之TCL--事物隔离级别--演示

正常的提交
mysql之TCL--事物隔离级别--演示
等待超时
mysql之TCL--事物隔离级别--演示