事务的四个隔离等级

1 read uncommitted

设置隔离等级为未提交读

mysql> set session transaction isolation level read uncommitted;

当线程A开启事务A后更新表中的数据,在未提交的情况下,
线程B开启的事务B可以访问到事务A的未提交结果,
则称之为未提交读隔离等级。

2 read committed

设置隔离等级为提交读

mysql> set session transaction isolation level read committed;

当线程A开启事务A后更新表,在未提交的情况下,
线程B开启的事务B是无法访问到事务A中的更新的。
在事务A执行commit之后,事务B即可访问到事务A中的更新。

3 repeatable read

设置隔离等级为可重复读

mysql> set session transaction isolation level repeatable read;

当线程A开启事务A后,保持事务A的连接。
此时线程B开启事务B并且插入了新数据并提交。
事务A此时执行select语句是无法访问到事务B所提交的数据的,
同时如果事务A此时insert了和事务B相同的数据,数据库会报错提示主键冲突。

就好像事务A产生了幻觉一样。这种场景我们称之为幻读

可重复读正如字面意思所示,事务A在执行多次select操作的时候,
不会受到其他事务的影响可以重复获取相同的数据。

4 serializable

设置隔离等级为可串行化

mysql> set session transaction isolation level serializable;

这是隔离中的最高等级,也是一把双刃剑。可以防止上述的幻读,方法就是给行加锁。

简单来说,
线程A开启事务A后在未进行操作的情况下,
线程B开启了事务B并且执行insert操作给表(user)增加了一行数据,
事务A在select表(user)的时候操作会被挂起,
直到事务B提交之后,事务A的select操作才会被执行。

也就是说事务B在执行insert操作后给表的新增行上了锁,
事务A在访问相同表的时候由于事务B仍然持有锁,
事务A必须等待事务B释放锁后(rollback或者commit)才可以操作该表。

由于锁的粒度是行等级的,这也就意味着如果事务B对表(user)的第10行进行了更新操作,在未提交的情况下,
事务A是可以访问到表(user)除了第10行以外的数据的。
如果select语句中包含了对第10行的访问或者操作,则将会被挂起。

总结

MySQL默认是可重复读隔离等级。

你可能感兴趣的:(事务的四个隔离等级)