先将数据设置为未提交可以读取的状态:
mysql> select @@version; ±----------+ | @@version | ±----------+ | 8.0.19 | ±----------+ 1 row in set (0.00 sec) mysql> show variables like ‘autocommit’; ±--------------±------+ | Variable_name | Value | ±--------------±------+ | autocommit | ON | ±--------------±------+ 1 row in set, 1 warning (0.00 sec) mysql> set autocommit=0 -> ; Query OK, 0 rows affected (0.00 sec) mysql> select @@transaction_isolation; ±------------------------+ | @@transaction_isolation | ±------------------------+ | REPEATABLE-READ | ±------------------------+ 1 row in set (0.00 sec) mysql> set session transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec)
select @@transaction_isolation;
set session transaction isolation level read uncommitted;
SELECT * from mmall_product where mmall_product.id = 42
默认的隔离级别之下是不能查询到为提交的值的
关于提交后可读的隔离级别:
是使用两个session进行模拟的,脏读实际上也是两个session进行模拟:
将数据库设置为可重复读:
关于幻读的理解:
https://www.jianshu.com/p/c921f995d58b
可重复读解决的是行锁的问题,不能读取与修改某
通过debug:测试确定可重复读表的行是加了写锁的,只能读不能写!
是不能更新数据的:
幻读是在一个事务开启后,其他的线程能对表插入或者更新其他行的数据,只是不能对指定的表的行进行操作,(例如对 id = 41 的行加了事务,其他行是不受约束的)
将数据库设置为序列化:
set session transaction isolation level serializable;
对数据库中id = 41这行进行操作: