发布时间:2023-02-25 17:30
每个级别都有字符或数字编号
我有记忆方法,先是RU、RC, 记住UC顺序,联想到UC WEB。
RR级别作为mysql事务默认隔离级别,是事务完全和性能的折中。SERIALIZABLE级别是悲观地认为幻读时刻都会发生,故会自动地隐式地对事务所需资源加排他锁,其他事务访问此资源会被阻塞等待,故事务是安全的,但需要认值考虑性能。
InnoDB的行锁锁定的是索引,而不是记录本身。索引映射的记录存在就加行锁,如果不存在则会加next-key lock/gap锁/间隙锁, 故InnoDB可以实现事务对某记录的预先占用。
脏读
不可重复读
幻读
幻读解决方法
1、把事务隔离级别调整到SERIALIZABLE。2、RR隔离级别下,对select操作手动加行锁,select ... for update,这也序列化隔离级别下隐式会做的事。
参考文章
幻读 https://segmentfault.com/a/1190000016566788
1、查看隔离级别
1)查看当前会话隔离级别
mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set, 1 warning (0.00 sec)
2)查看系统隔离级别
mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | READ-UNCOMMITTED | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
2、设置隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
1)设置当前会话
mysql> set session transaction isolation level repeatable read; Query OK, 0 rows affected (0.00 sec)
2)设置系统
mysql> set global transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec)3、命令行,开始事务时用
自己在命令行去验证几种隔离级别下的读问题。
在不可提交读, 也就是READ UNCOMMITED情况下,会产生脏读。
在可提交读, 也就是READ COMMITED情况下,会产生不可重复读。
repeatable read(MySQL默认隔离级别),这时候能解决可重复读。
右边事务提交了,修改了age=29,左边再次查询,还是28。
repeatable read(MySQL默认隔离级别),这时候还会出现幻读。
到此这篇关于mysql数据库隔离级别文章就介绍到这了,更多相关mysql隔离级别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!