Mysql事务隔离级别
-- 查看事务隔离级别
mysql> show variables like '%tx_isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
-- 修改隔离级别
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.04sec)
锁的类别
写锁: Write Lock
只有持有写锁的事务才能对数据进行写入操作,数据加持着写锁时,其他事务不能写入数据,也不能施加读锁
读锁:Read Lock
多个事务可以同时对同一个数据添加读锁,数据被加上读锁后就不能再被其他事务加上写锁,所以其他事务不能对该数据进行写入,但是仍然可以读取。对于持有读锁的事务,如果该数据只有一个事务加了读锁,可以直接将其升级为写锁,然后写入数据
范围锁:Range Lock
对于某个范围直接加排他锁,在这个范围内的数据不能被读取,也不能被写入。注意:范围锁是锁定范围,而不是仅锁定范围内已有的数据,当一个事务添加范围锁之后,另一个事务不仅无法修改该范围内已有的数据,也不能在该范围内添加或删除任务数据。
隔离级别
可串行化
对事务所有读、写的数据全都加上读锁、写锁和范围锁
可重复读(幻读)
该隔离级别的定义:对事务所涉及到的数据加读锁和写锁,并且一直持续到事务结束,但不加范围锁。
但是在Mysql中,如果是只读事务,不会发生幻读;但是读写事务同样会有幻读现象发生。
读已提交(不可重复读)
对事务涉及到的数据加的写锁,会一直持续到事务结束,但加的读锁在查询操作完成后马上就会释放
读未提交(脏读)
一个事务读取到了另一个未提交的事务修改过的数据,称之为读未提交。对事务涉及到的数据只加写锁,一直持续到事务结束,但是完全不加读锁
不同隔离级别现象解释
脏读
第一个事务正在访问数据库,并且对数据进行了修改,但是该修改还没有提交,这时,第二个事务也访问这个数据,并且访问到了没有提交的最新值。之所以叫脏读,是因为第一个事务可能回滚,一旦第一个事务回滚之后,第二个事务读取到的值将是一个脏数据(无效的值)
不可重复读
在第一个事务中多次读取同一个数据期间,第二个事务对该数据进行了修改,导致第一个事务多次读取的数据可能是不一样的,这种在一个事务内多次读取的同一个数据不同的现象称为不可重复读。之所以叫不可重复读,是因为在同一个事务内重复读取同一个的数据的值是不一样的。
幻读
在第一个事务执行的过程中,第二个事务插入了一条新数据,导致第二个事务发生前后两次条件完全相同的范围查询得到了不同的结果集,感觉就像发生了幻觉