MySQL 并发事务问题和隔离级别 (事务篇 三)

并发事务问题和解决

1. 脏读(Dirty Read):

脏读是指一个事务读取了另一个事务未提交的数据

当一个事务修改了数据但尚未提交时,另一个事务读取到了这个未提交的数据,如果第一个事务最终回滚了,那么第二个事务读取到的数据就是无效的。

MySQL通过使用锁机制来解决脏读问题,当一个事务对数据进行修改时,会对相关数据加锁(排它锁 -- X锁),其他事务在读取该数据时需要等待锁释放。

2. 不可重复读(Non-repeatable Read):

不可重复读是指在同一个事务中,多次读取同一数据,但得到的结果不一致

这是因为在事务执行期间,其他事务可能对数据进行了修改或删除。

MySQL使用MVCC(版本控制)来解决不可重复读问题。MVCC为每个事务创建一个独立的数据版本,事务在读取数据时会根据自己的版本号获取数据。当一个事务执行读操作时,如果其他事务对数据进行了修改或删除,MySQL会根据事务的版本号和时间戳来判断数据的可见性(事务开始时的数据快照),确保读取到的数据是一致的,避免了不可重复读问题。

3. 幻读(Phantom Read):

幻读是指在同一个事务中,多次执行相同的查询(一般是范围查询),但返回的结果集不一致。或者一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

这是因为在事务执行期间,其他事务可能插入或删除了符合查询条件的数据。

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

事务隔离级别越高,数据越安全,但是性能越低

上一篇:MySQL 事务的操作指南(事务篇 二)

你可能感兴趣的:(MySQL数据库,mysql,数据库)