1、事务的隔离级别
(1)隔离级别
Read uncommitted # 读,未提交
Read committed # 读,已提交
Repeatable Read(默认) # 可重复读
Serializable # 串读
(2)基础语法
set transaction isolation level 事务的隔离级别
2、脏读
(1)脏读演示
·【1】将事务的隔离级别设置为“读,未提交”;
·【2】开启两个独立的事务;
·【3】在左边事务中,显示account表的所有数据;
·【4】在右边事务中,修改account表中数据(jom的money数据),此时右边表中的数据改动未提交;
·【5】在左边事务中,再次显示account表中所有数据,可以看到,account表中数据出现变动,这是因为左边事务受到了右边事务的影响,导致数据出现了错误。
(2)避免脏读
【1】将事务的隔离程度设置为“读,已提交”,再按照上述顺序执行【2】、【3】、【4】、【5】、【6】即可,发现并未出现脏读变化。
3、不可重复读
(1)不可重复读演示
·【1】将事务的隔离程度设置为“读,已提交”,开启左右两个事务;
·【2】左边事务查看account表中所有数据;
·【3】右边事务修改表中数据;
·【4】再次调用select,左边事务查看account表中所有数据;
·【5】提交右边事务数据;
·【6】再次调用select,左边事务查看account表中所有数据,发现两次account表中数据显示不一致;
(2) 避免不可重复读
·【1】将左边事务隔离程度设置为“可重复读”,左右开启事务;
·【2】左边事务调用select语句,显示account表中所有数据;
·【3】右边事务修改account表中数据;
·【4】提交右边事务;
·【5】左边事务调用select语句,再次显示account表中所有数据,发现数据并未发生改变;
4、幻读
(1)幻读演示
·【1】将事务的隔离级别设置为“可重复读”;
·【2】左右两边开启事务;
·【3】左边事务调用select函数,查看account表中id=3的行数据,发现account中并不存在id=3的行数据;
·【4】右边事务调用insert函数,给account表中田间id=3的行数据;
·【5】左边事务再次调用insert函数,给account添加id=3的行数据,MySQL会提示错误“id=3已被占用”;
·【6】在左边事务调用select函数,查看id=3的行数据,发现id=3的行数据并不存在;
(2) 避免幻读
【1】将事务的隔离级别设置为串读,其余再如上执行即可。