mysql数据库4种事务隔离级别验证
1.建表
create table account(id int primary key,name varchar(20),account decimal(15,3));
2.准备初始数据
insert into account(id,name,account) values (1,'lilei',450),(2,'hanmei',16000),(3,'lucy',2400);
3.查看当前默认隔离级别
4.读未提交试验
set session transaction isolation level read uncommitted;
打开客户端A,读取account表
打开另一个客户端B,同样设置隔离级别为读未提交,并更新记录
结论:这时虽然B的事务未提交,但是A已经能查到B更新的记录
5.设置A和B,隔离级别为read committed
B端结果
A端结果
结论:可以看到在A前后两次查询,未读取到中间B更新但未提交的数据,解决了脏读的问题
6.可重复读测试,将A和B隔离级别都设置为repeatable read
B在A查询事务间更新数据并提交
A多次查询,结果只有在A结束事务才看到最新的数据,事务期间读取的数据是一样的
结论:A在事务中多次查询的结果是一样的,即使B在A事务期间插入、更新、删除了数据,这时A查询结果依然不变,直到A提交后再查询,才能读取数据库中最新记录。
7.串行化测试
将A和B隔离级别都设置为serializable
A
start transaction;
B
insert into account values(5,'tom',0);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
B会等待,直到超时。