赞
踩
脏读是指一个事务读取了另一个事务未提交的数据。
当一个事务修改了数据但尚未提交时,另一个事务读取到了这个未提交的数据,如果第一个事务最终回滚了,那么第二个事务读取到的数据就是无效的。
MySQL通过使用锁机制来解决脏读问题,当一个事务对数据进行修改时,会对相关数据加锁(排它锁 -- X锁),其他事务在读取该数据时需要等待锁释放。
不可重复读是指在同一个事务中,多次读取同一数据,但得到的结果不一致。
这是因为在事务执行期间,其他事务可能对数据进行了修改或删除。
MySQL使用MVCC(版本控制)来解决不可重复读问题。MVCC为每个事务创建一个独立的数据版本,事务在读取数据时会根据自己的版本号获取数据。当一个事务执行读操作时,如果其他事务对数据进行了修改或删除,MySQL会根据事务的版本号和时间戳来判断数据的可见性(事务开始时的数据快照),确保读取到的数据是一致的,避免了不可重复读问题。
幻读是指在同一个事务中,多次执行相同的查询(一般是范围查询),但返回的结果集不一致。或者一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。
这是因为在事务执行期间,其他事务可能插入或删除了符合查询条件的数据。
MySQL通过使用间隙锁(Gap Lock)来解决幻读问题。间隙锁锁定了一个范围而不是具体的数据行,阻止其他事务在该范围内插入新数据。
查询和修改隔离级别
- -- 查看
- select @@transaction_isolation;
- -- 修改(建议选用会话(当前连接有效)session)
- set [ session | global ] transaction isolation
- level { read uncommitted | read committed | repeatable read | serializable }
四个隔离级别
隔离级别 | 可能出现的问题 |
Read uncommitted -- 读未提交 | 脏读、不可重复读、幻读 |
Read committed -- 读已提交 | 不可重复读、幻读 |
Repeatable Read(默认) -- 可重复读 | 幻读 |
Serializable -- 串行化 | x |
事务隔离级别越高,数据越安全,但是性能越低
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。