AUTOCOMMIT
Mysql默认自动提交,可以通过如下命令查看和修改:
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
隐式锁显式锁
InnoDB在开启事务时,获取隐式锁,在事务提交或者回滚时释放锁,InnoDB根据隔离级别自动处理锁。
但InnoDB也支持显式锁:
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
多版本并发控制(Multiversion Concurrency Controll MVCC)
第一点:
MVCC并不是MySql独有的,Oracle,PostgreSQL等都在使用。
MVCC并没有简单地使用行锁,而是使用“行级别锁”(row-level locking)。MVCC的基本原理是:
在事务中保存数据的快照,这意味着在一个事物里能够看到数据一致的视图,而不用担心这个事务运行多长时间,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。
MVCC的基本特征:
- 每行数据都存在一个版本,每次数据更新时都更新该版本
- 修改时Copy出当前版本随意修改,个事务之间无干扰
- 保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
InnoDB存储引擎MVCC的实现策略:
在每一行数据中额外保存两个隐藏字段:当前行创建时的版本号和删除时的版本号(可能为空)。每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。具体做法见下面的示意图。
但是在网上又看到另外一种说法:
- 事务以排他锁的形式修改原始数据
- 把修改前的数据存放于undo log,通过回滚指针与主数据关联
- 修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)
二者最本质的区别是,当修改数据时是否要排他锁定,如果锁定了还算不算是MVCC?
Innodb的实现真算不上MVCC,因为并没有实现核心的多版本共存,undo log中的内容只是串行化的结果,记录了多个事务的过程,不属于多版本共存。但理想的MVCC是难以实现的,当事务仅修改一行记录使用理想的MVCC模式是没有问题的,可以通过比较版本号进行回滚;但当事务影响到多行数据时,理想的MVCC据无能为力了。
比如,如果Transaciton1执行理想的MVCC,修改Row1成功,而修改Row2失败,此时需要回滚Row1,但因为Row1没有被锁定,其数据可能又被Transaction2所修改,如果此时回滚Row1的内容,则会破坏Transaction2的修改结果,导致Transaction2违反ACID。
理想MVCC难以实现的根本原因在于企图通过乐观锁代替二段提交。修改两行数据,但为了保证其一致性,与修改两个分布式系统中的数据并无区别,而二提交是目前这种场景保证一致性的唯一手段。二段提交的本质是锁定,乐观锁的本质是消除锁定,二者矛盾,故理想的MVCC难以真正在实际中被应用,Innodb只是借了MVCC这个名字,提供了读的非阻塞而已。
分享到:
相关推荐
C++学习笔记和实践项目,实践项目包括Json工具类、设计模式的C++实现、消息队列、智能指针,linux下的并发控制工具、线程池,epoll管理器和Mysql连接池、STL容器的快捷输出工具和页面置换算法(FIFO, LRU, LFU)的...
适合对mysql有一定基础的...2.2、MVCC多版本并发控制机制 3、Mysql日志 3.1、总体架构 3.2、INNODB日志 4、全局优化 4.1、全局参数配置 5、8.0新特性 5.1、Mysql8.0.17新特性 6、安装集群 6.1、单机版本 6.2、主从复制
笔记文摘 用 markdown 书写的笔记(部分来源于互联网),共享出来给大家!...Rust 学习笔记及示例代码: Learning Rust 。 Bash 相关: 本人翻译的 Bash 中文指南 ,不错的 linux bash 命令入门材料。 Vue 相关: Vu
等技术笔记。 目前还不完善,正在不断更新。 一、算法 下面的三个专栏得到了大部分人的点赞,推荐给大家 OJ: Codeforces、LeetCode、NowCoder。 之前在牛客网发的两篇帖子,算是给自己项目做了一个推广 ^_^ 部分文章...
多线程、锁、并发 框架 Spring , Mybatis , SpringBoot , SpringMVC ... 中间件 RPC , MQ , elasticsearch ... 操作系统linux 数据库 Mysql , MongoDB , HBase ... 优化 常用工具 git , svn , 效率 , aliyun , mac ,...
WARNING]所有笔记和代码均基于Java 8版本,基本大部分包含Java语言的全部核心知识点。 Java基础 Java虚拟机 Java并发与多线程 :open_file_folder:数据库 [!WARNING | label:注意区分下数据库和ORM框架!] 数据库...
VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...
韩顺平java笔记和源码 ...:数据结构与算法笔记,主讲Go、C版本,另附JS,Java版本 :包含网页、JS、前端工程化、Node、vue、react等JS相关领域技术 :详尽的Go领域笔记,包括语法、并发编程、web编程、微
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
与数据库相关的,MySQL以及MySQL高性能 框架 Spring, Spring MVC, MyBatis, Spring Boot, Netty, Tomcat Servlet容器 工具库 Guava, JodaTime, Logging, Shiro, Apache 计算机网络 计算机网络基础 Http Http2 Https ...
:分布式系统笔记,包括网络知识、并发模型、时间同步方法、分布式文件系统、容错、复制、集群计算、Spark、虚拟化、安全协议。 : Go 语言和 Gin 框架的注释。 :Go 语言基础和如何编写 Go 程序的笔记。 :Web 框架 ...
本项目用于Linux Cpp后台开发秋招学习,内容主要涵盖以下几个部分:Cpp进阶,操作系统, 计算机网络, Linux内核,MySQL数据库, Redis数据库, 数据结构与算法,Leetcode刷题等内容。我会对校招所需掌握的基础...
美食优惠个人笔记+面经专注于数据科学(推荐系统,机器学习,并行计算,预期) 所有面经都在持续,迭代更新中... 面经Mysql 01基础架构 02日志系统 03事务隔离 面经并发 01线程 02管程 03内存 04无锁 05不可...
多线程与并发 ; ; ; 。 Java虚拟机 ; ; ; ; ; ; ; ; ; 。 4,Java Web Servlet ; ; ; ; 。 前端 ; ; ; ; ; ; ; 。 JDBC ; 。 MySQL ; ; ; ; ; ; 。 ...
Java学习笔记 :rocket: Author Samin Date 2019-11-12 Desc 分享一下自己如何收集整理分类知识点,旨在帮助开发者们学会整理自己的知识库 [TOC] leetcode :blue_book: 力扣刷题记录 :paperclip: algorithms 算法刷题...