美文网首页
MySQL 事务隔离

MySQL 事务隔离

作者: 不一样的卡梅利多 | 来源:发表于2019-08-26 15:54 被阅读0次
1、隔离级别分类:

0、SERIALIZABLE:串行执行
1、REPEATABLE READ (默认) :可重复读 ,含有mvcc,含有Next-key lock
2、READ COMMITTED:可提交读 ,含有mvcc
3、READ UNCOMMITTED :未提交读,当前读

2、如何设置当前事务隔离级别:
 #设置当前会话隔离级别
 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 #查看当前会话隔离级别
 SELECT @@session.tx_isolation;
3、测试结果

1、RR 隔离级别下面 对select 的影响 ?

0、以第一条select 语句为基点创建快照,只要使用了一次select ,后续select 的值不会受其他事务影响。含有mvcc 实现
1、当前事务 select 只能查询到数据版本号在当前事务之前的版本。(select 只读当前快照,没有锁)
2、当前事务 不能看到其他事务修改的数据,包括已提交的数据。

2、RR 隔离级别下面 对Next-Key 的影响 ?

1、当前事务update 操作默认加上Next-Key lock。而不是只加锁指定的记录。 其他事务隔离级别下面 update 只会锁定已查找到的记录
2、 Next-Key lock 的范围内,其他事务对相关记录的操作(update ,delete ,insert )将被挂起。普通的select 操作无影响
3、 Next-Key lock 在RR 以上级别生效。

3、RC 隔离级别下面 对select 的影响? mvcc 实现

1、RC 级别的每一次select 都能看到其他事务已提交的数据。
2、RC 级别都有自己的数据版本,当数据提交后。数据版本升级为最新的。

4、RU隔离级别下面 对select 的影响? 无mvcc 实现

1、RC 级别的每一次select 都能看到最新的修改,包括未提交的数据。

4、锁与sql 语句关系

快照读: 如果有mvcc 版本控制,那么将按照版本读取数据。不会加锁

                 select * from table where ?

当前读:特殊的读操作,插入/更新/删除操作,属于当前读 加锁。会阻塞其他操作。

             select * from table where ? lock in share mode ;
             select * from table where ? for update ;
             update table set ? where ? ;
             delete from table where ? ;
5、锁与事务隔离与mvcc 关系

1、事务隔离级别 与mvcc 关系

RR ,RC 级别,用不同数据版本来实现事务隔离。避免了加锁。这样就更加高效 不同的事务隔离级别,看到不同的数据版本

2、事务隔离级别 与锁的相关性

RR 级别 隐含实现了 Next-Key lock 。RR 级别下面的 会加强显示锁的区别,来保证 隔离级别的正确性。

3、事务隔离级别 与锁的无性

如下语句:都会对选中的记录加锁,独占锁的方式。不管事务是何种隔离级别
select * from table where ? lock in share mode
select * from table where ? for update ;
update table set ? where ? ;
delete from table where ? ;

6、总结

1、行数据的 事务ID 与数据版本属性。数据版本递,按照数据修改发生的时间。事务ID 递增,按照创建事务的时间。


数据版本vs事务ID.png

2、数据修改(有锁,行锁,间隙锁),使用当前读更新。并且每次更新都会记录一次数据版本。不能丢失所有事务的更新,所有事务的更新应该是"串行"执行。

3、数据读,在行数据的版本历史上面查找哪些事务ID 可见(无锁)。但是也可以使用当前读语句获取最新的数据版本(有锁)

相关文章

网友评论

      本文标题:MySQL 事务隔离

      本文链接:https://www.haomeiwen.com/subject/gmqdectx.html