前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于MySQL事务隔离级别

关于MySQL事务隔离级别

作者头像
星哥玩云
发布2022-08-16 15:44:53
6890
发布2022-08-16 15:44:53
举报
文章被收录于专栏:开源部署

第一部分:概述

MySQL遵循SQL:1992标准,提供READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE四种事务隔离级别。InnoDB默认使用的事务隔离级别是REPEATABLE READ。

用户可以自己修改会话或全局级别的事务隔离级别,语法如下:

SET [GLOBAL | SESSION] TRANSACTION transaction_characteristic [, transaction_characteristic] ... transaction_characteristic: ISOLATION LEVEL level | READ WRITE | READ ONLY level: REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE

你也可以在启动时添加--transaction-isolation启动项或者将其写入配置文件,来设置相应的全局事务隔离级别。

READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE这四种事务隔离级别所提供的事务一致性是越来越强的,但是并发性却是却来越差的。

第二部分:事务隔离级别

提到事务隔离级别就必须先明确以下三种读:

脏读:读到了其他事务已修改但未提交的数据 不可重复读:由于其他事务的修改,导致同一事务中两次查询读到的数据不同 幻读:由于其他事务的修改,导致同一事务中两次查询读到的记录数不同

1.READ UNCOMMITTED

这种隔离级别下select语句是不加事务锁的,因此会产生脏读,这种事务隔离级别是应当完全避免的。除select语句以外的其他语句加锁模式与READ COMMITTED一样。

2.READ COMMITTED

同REPEATABLE READ一样,这种隔离级别下也实现了一致性非锁定读,但区别在于此隔离级别下的一致性读是语句级的,即只能避免脏读,不能避免不可重复读和幻读。其实现方式大致是:

  • select语句检测要锁定的索引记录上是否有独占锁。
  • 如果有独占锁那么到undo中寻找最近的前镜像。
  • 如果没有独占锁那么添加S模式的record lock。

在这种隔离级别下,InnoDB只使用record lock类型的行锁,不使用gap锁。

此外:如果你使用READ COMMITTED事物隔离级别,那么binlog模式必须修改为row模式!

关于具体的MVCC实现方式,MySQL官网并未提供具体的实现步骤,可以选择去查看源码,也可以参考Oracle和SQL Server的实现机制。

3.REPEATABLE READ

这是MySQL的默认事务隔离级别。在一个事务当中第一次读会建立一个snapshot,同事务的相同select语句会读取这个snapshot来实现一致性非锁定读。

这种隔离级别下可以避免脏读、不可重复读和幻读。

对于select for update/select lock in share mode/update/delete这些锁定读,加行锁模式取决于索引的类型:

  • 对唯一索引的访问只会添加record lock,而不会使用gap lock(即也没有next-key lock)。
  • 对非唯一索引的访问使用gap lock或者next-key lock,如果访问的记录不存在就是gap lock,否则就是next-key lock。

4.SERIALIZABLE

这种事务隔离级下select语句即便不加lock in share mode也使用lock_mode=S的行锁,select自成事务,锁直到事务结束才释放。

这种隔离级别下可以避免脏读、不可重复读和幻读。

DML语句的加锁模式与REPEATABLE READ一样。

第三部分:总结

一般来说我们没必要去修改默认的事务隔离级别,当然如果你的数据库并不在意幻读和不可重复读,可以修改未read committed隔离级别,这样可以增加并发减少阻塞,据说淘宝也是这么干的。Oracle默认的事务隔离级别也是read committed,同样不可避免幻读和不可重复读。

关于MySQL的锁机制,可以参考:https://www.linuxidc.com/Linux/2018-04/151914.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档