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、主从复制
这篇学习笔记涵盖了软件工程师在职业发展中需要掌握的关键领域,包括网络、操作系统、设计模式、Java虚拟机(JVM)、多线程与高并发处理、Spring框架以及MySQL数据库。以下是对这些知识点的详细解读: 1. **网络**...
这些学习笔记涵盖了IT领域的多个关键知识点,让我们一一深入探讨。 首先,JVM(Java Virtual Machine)是Java程序运行的基础,它是Java平台的核心组成部分。理解JVM的工作原理对于优化Java应用程序性能至关重要。...
### MySQL学习笔记:常见错误与理解 在MySQL的学习与实践中,遇到各种错误代码是在所难免的,理解并解决这些错误是提升技能的关键。本文将基于提供的文件内容,深入解析MySQL中的一些常见错误及其背后的原理,帮助...
数据库面试题通常涵盖SQL查询优化、数据库设计原则、并发控制策略、备份恢复和性能监控等方面。通过解答这些问题,你可以检验自己的理论知识和实践经验,提高解决实际问题的能力。 总结来说,学习MySQL、MariaDB和...
特别是InnoDB存储引擎的MVCC(多版本并发控制)机制,是理解并发性能的关键。 5. **并发控制**:MySQL使用了各种并发控制策略,如锁定、乐观锁、死锁检测等。在源码中,可以找到这些机制的实现细节。 6. **网络...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理数据。...通过这些笔记,你可以系统地学习和理解MySQL数据库、Java并发编程以及JVM的运作机制,为你的软件开发职业生涯打下坚实的基础。
本压缩包中的学习笔记涵盖了五大主流数据库系统:Oracle、MySQL、MongoDB、Redis以及Neo4j,它们各自拥有独特的特性和用途,适用于不同的场景。 1. Oracle数据库: Oracle是一款关系型数据库管理系统(RDBMS),在...
在源码层面,数据库管理系统通常会实现复杂的并发控制算法,如两阶段锁(2PL)、多版本并发控制(MVCC)等,来保证事务的正确执行。例如,MySQL的InnoDB存储引擎就使用了MVCC来支持高并发读写操作,而Oracle数据库则...
通过为数据记录保存多个版本,每个事务看到的数据版本可能是不同的,从而降低锁的需求,提高并发性能。InnoDB通过MVCC实现了事务的隔离性,确保在不同事务中可以同时读取同一行数据的不同版本。 8. 事务并发导致的...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
然而,随着并发操作的增加,数据库可能会遇到一种特殊的问题——死锁。死锁是指两个或多个事务在等待对方释放资源,从而导致它们都无法继续执行的情况。本文将深入探讨MySQL中的死锁现象,以及如何识别、避免和解决...
Java学习笔记涵盖了许多核心的IT知识点,以下是这些主题的详细说明: **JVM(Java虚拟机)** Java虚拟机是Java程序运行的基础,它负责解释和执行字节码。理解JVM的工作原理对于优化程序性能至关重要。这包括类加载...
TUNNEL提供高并发的离线数据上传下载服务,用户可以使用Tunnel服务向MaxCompute批量上传或下载数据。数据通道供用户使用,计算及分析任务包括SQL和MapReduce。MaxCompute的SQL功能强大,可以存储TB、PB级别的海量...
### Oracle 最全学习笔记知识点梳理 #### 一、存储过程 - **定义**:存储过程是一种在数据库中存储复杂程序以便外部程序调用的一种数据库对象。 - **应用场景**:主要用于执行大量的更新或插入操作,以提高数据库...
My通常指的是MySql,是最广泛使用的开源关系型数据库之一,学习这两者的使用和优化策略对提升系统的性能和稳定性有着直接的影响。 这个压缩包中的“kwan1117”可能是一个目录或者笔记文件,里面可能详细记录了学习...
笔记文摘 用 markdown 书写的笔记(部分来源于互联网),共享出来给大家!...Rust 学习笔记及示例代码: Learning Rust 。 Bash 相关: 本人翻译的 Bash 中文指南 ,不错的 linux bash 命令入门材料。 Vue 相关: Vu
MyCat是基于MySQL数据库的分布式数据库中间件,它在大数据量、高并发的场景下,提供了优秀的数据库分片和读写分离解决方案。本资源包含了MyCat集群的学习笔记和相关课件,适合对分布式数据库系统感兴趣的开发者和...