Mysql事务隔离级别

本文深入探讨了MySQL中的事务隔离级别,包括读未提交、读已提交、可重复读和可串行化,以及相应的数据一致性问题:脏读、不可重复读和幻读。还详细介绍了锁的类型,如WriteLock、ReadLock和RangeLock,以及它们在不同事务状态下的应用。通过设置事务隔离级别,可以防止并发操作带来的数据异常。
摘要由CSDN通过智能技术生成

-- 查看事务隔离级别
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中,如果是只读事务,不会发生幻读;但是读写事务同样会有幻读现象发生。

读已提交(不可重复读)

对事务涉及到的数据加的写锁,会一直持续到事务结束,但加的读锁在查询操作完成后马上就会释放

读未提交(脏读)

一个事务读取到了另一个未提交的事务修改过的数据,称之为读未提交。对事务涉及到的数据只加写锁,一直持续到事务结束,但是完全不加读锁

不同隔离级别现象解释

脏读

第一个事务正在访问数据库,并且对数据进行了修改,但是该修改还没有提交,这时,第二个事务也访问这个数据,并且访问到了没有提交的最新值。之所以叫脏读,是因为第一个事务可能回滚,一旦第一个事务回滚之后,第二个事务读取到的值将是一个脏数据(无效的值)

不可重复读

在第一个事务中多次读取同一个数据期间,第二个事务对该数据进行了修改,导致第一个事务多次读取的数据可能是不一样的,这种在一个事务内多次读取的同一个数据不同的现象称为不可重复读。之所以叫不可重复读,是因为在同一个事务内重复读取同一个的数据的值是不一样的。

幻读

在第一个事务执行的过程中,第二个事务插入了一条新数据,导致第二个事务发生前后两次条件完全相同的范围查询得到了不同的结果集,感觉就像发生了幻觉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值