没什么特别的就想实际看看是不是和书上说的一样不一样
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
新建终端A,查看数据库的版本,虽然你安装的时候就知道,但有时候长久不用,需要确认一下
select
查看数据库事务级别
mysql
先看一下有哪些数据库,也可以使用navicat看
show
然后选择一个数据库,再选择里面的一个数据表,可能有某些博客直接起手就是数据表,然后你就发现自己报错了,就是因为没有选择数据库。可以按照下面的顺序执行,这里选择了course表。
use
读未提交
开启事务
start
更新表里的一个数据,记得在更新数据之前一定要先使用上面那句,不然会默认自动提交,然后你就会看到明明mysql是可重复读的但是却出现了脏读的情况。
update
然后在当前终端页面,如果是Mac可以使用command + N得到一个新的终端页面
在给新终端B设置事务级别之前还是一样的一定要先选一个数据库
use
默认mysql隔离级别情况下,B端是看不到更新后的数据的
在设置了读为提交的事务隔离级别后可以看到更新后的数据了,也就是出现了脏读情况
set
如果你不相信你还可以把B终端的事务等级重新设置一下
set
可以看到设置以后,因为A还没有提交事务,所以B终端上看不到改变后的结果了。
读已提交
在A端使用提交事务的命令后
commit
在之前设置的B端的读已提交的情况下可以看到更新后的数据了
set
可重复读
将A端和B端都设置为可重复读,
set session transaction isolation level repeatable read;
在A端插入新数据,
insert into course values('0005','生物','0005');
这时候A端会显示
然后再查询B端
可以看到并没有显示
内容太多,分成两篇,准备中。。。
参考博客:
https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/Redis/redis-all.md