mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务;
1、隔离级别
事务的隔离级别分为:未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)、串行化(serializable)。
未提交读
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;---出现脏数据
已提交读
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;---不可重复读
可重复读
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;
串行化
不允许读写并发操作,写执行时,读必须等待;
关于脏读、不可重复读、幻读
1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,
事务B正在读取张三的工资,读取到张三的工资为8000。
随后,
事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,
事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。
2、不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如:
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,
事务B把张三的工资改为8000,并提交了事务。
随后,
在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
3、幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
2、数据库设置
//查看当前事物级别: SELECT @@tx_isolation;
//设置mysql的隔离级别: set session transaction isolation level 设置事务隔离级别
//设置read uncommitted级别: set session transaction isolation level read uncommitted; //设置read committed级别: set session transaction isolation level read committed; //设置repeatable read级别: set session transaction isolation level repeatable read; //设置serializable级别: set session transaction isolation level serializable;
3、Mysql 8.0+ 查询数据库事务隔离级别
根据慕课网课程中的方法,查询事务隔离级别使用:
select @@tx_isolation;
我在sequal pro中,却提示错误:Unknown system variable 'tx_isolation'
查询了官方文档,在8.0+就已经抛弃了这样的查询方法,https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
在MySQL 8.0.3 中,该变量已经被 transaction_isolation 替换了。
最新的查询方法有多种,下面提供2种:
1、select @@transaction_isolation;
2、show variables like 'transaction_isolation';
原文出处:
奇天异下, mysql事务隔离级别与设置, https://www.cnblogs.com/huasky/p/11190086.html
LXMAJS, Mysql 8.0+ 查询数据库事务隔离级别, https://www.cnblogs.com/lxmajs/p/10277901.html