mysql innodb存储引擎 锁 事务
以下内容翻译自mysql5.6官方手册。
InnoDB是一种通用存储引擎,可平衡高可靠性和高性能。在MySQL 5.6中,InnoDB是默认的MySQL存储引擎。除非已经配置了不同的默认存储引擎,否则发出没有ENGINE =子句的CREATE TABLE语句会创建一个InnoDB表。
InnoDB的主要优势包括:
- 其DML操作遵循ACID模型,具有提交,回滚和崩溃恢复功能的事务以保护用户数据。
- 行级锁定和Oracle风格一致的读取增加了多用户并发和性能。
- InnoDB表将您的数据安排在磁盘上,以根据主键优化查询。每个InnoDB表都有一个主键索引,称为聚集索引,用于组织数据以最小化主键查找的I / O。
- 为了保持数据的完整性,InnoDB支持FOREIGN KEY约束。检查外键,插入,更新和删除是否确保不会导致不同表之间的不一致。
使用InnoDB表时的最佳做法:
- 使用最常查询的列或列指定每个表的主键,如果没有明显的主键,则指定自动递增值。
- 根据这些表中ID值,使用连接从多个表中提取数据。对于快速连接性能,请在连接列上定义外键,并在每个表中声明具有相同数据类型的列。添加外键确保引用的列被索引,这可以提高性能。
- 关闭自动提交。提交数百次,对性能有所限制(受到存储设备的写入速度的限制)。
- 将相关的DML操作集合到事务中,通过将其与START TRANSACTION和COMMIT语句相结合。虽然您不想太经常提交,但您也不希望发布大量批量的INSERT,UPDATE或DELETE语句,而这些语句长时间不被提交。
- 不使用LOCK TABLES语句。 InnoDB可以处理多个会话,一次读取和写入同一个表,而不会牺牲可靠性或高性能。要获取对一组行的独占写访问权限,请使用SELECT ... FOR UPDATE语法来锁定您要更新的行。
多版本存储引擎
InnoDB是一个多版本的存储引擎:它保存有关旧版本的行的信息,以支持事务功能,如并发和回滚。该信息存储在称为回滚段(在Oracle中类似的数据结构之后)的数据结构中的表空间中。 InnoDB使用回滚段中的信息执行事务回滚所需的撤消操作。它还使用这些信息来构建一行的较早版本以便一致性读取。
锁和事务
共享和独占锁
InnoDB实现标准的行级锁定,其中有两种类型的锁,共享(S)锁和排他(X)锁。
共享(S)锁允许保存锁的事务读取一行。
独占(X)锁允许持有锁的事务更新或删除行。
如果事务T1在行r上保持一个共享(S)锁,那么来自某个不同事务T2的针对行r上的锁的请求被处理如下:
可以立即授予T2对于S锁的请求。 因此,T1和T2都在r上持有S锁。
X锁定的T2请求不能被立即授予。
如果事务T1在行r上保持独占(X)锁定,则不能立即授予来自某个不同事务T2的对r类型的锁的请求。 相反,事务T2必须等待事务T1释放其在行r上的锁定。
非阻塞的一致读
和oracle一样,可以保证一个时间点的读一致性。读取的是读取时间点的数据。这是通过mmvp来实现的,同时,由于有mmvp的存在,可以实现非阻塞的读操作。
InnoDB中的不同SQL语句设置的锁
A locking read(使用了select for update 或者使用了serializerable隔离级别),UPDATE或DELETE通常在处理SQL语句时扫描的每个索引记录上设置记录锁(可能比真正的where语句中设置的行要多)。跟where语句中是否包含该行无关。 InnoDB不记得确切的WHERE条件,但只知道哪个索引范围被扫描。
如果没有适合您的语句的索引,MySQL必须扫描整个表来处理该语句,表中的每一行都将被锁定,从而阻止其他用户对表的所有插入。创建好的索引很重要,这样您的查询就不会不必要地扫描许多行。
InnoDB设置特定类型的锁如下。
- SELECT ... FROM是一致的读取,读取数据库的快照,并且不设置锁定(任何锁都不设置 包含S锁),除非事务隔离级别设置为SERIALIZABLE。对于SERIALIZABLE级别,搜索会在遇到的索引记录上设置共享的下一个锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
- SELECT ... FROM ... LOCK IN SHARE MODE在搜索遇到的所有索引记录上设置共享锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
- SELECT ... FROM ... FOR UPDATE在搜索遇到的每个记录上设置独占锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
- UPDATE ... WHERE ...在搜索遇到的每个记录上设置独占锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
- DELETE FROM ... WHERE ...在搜索遇到的每个记录上设置一个独占锁定但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
- INSERT在插入的行上设置排他锁。
mysql innodb存储引擎 锁 事务的更多相关文章
- (转)Mysql技术内幕InnoDB存储引擎-事务&备份&性能调优
事务 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC ...
- 浅析Mysql InnoDB存储引擎事务原理
浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021
- MySQL InnoDB 存储引擎探秘
在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用, ...
- 设置mysql InnoDB存储引擎下取消自动提交事务
mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...
- MySQL InnoDB存储引擎体系架构 —— 索引高级
转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...
- MySQL InnoDB存储引擎中的锁机制
1.隔离级别 Read Uncommited(RU):这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. Read Committed (RC):仅能读取到已提交 ...
- MySQL InnoDB存储引擎事务的ACID特性
1.前言 相信工作了一段时间的同学肯定都用过事务,也都听说过事务的4大特性ACID.ACID表示原子性.一致性.隔离性和持久性.一个很好的事务处理系统,必须具备这些标准特性: 原子性(Atomicit ...
- MySQL InnoDB存储引擎
200 ? "200px" : this.width)!important;} --> 介绍 本篇文章是对Innodb存储引擎的概念进行一个整体的概括,innodb存储引擎的 ...
- mysql innodb存储引擎介绍
innodb存储引擎1.存储:数据目录.有配置参数为“ innodb_data_home_dir ” .“ innodb_data_file_path ” 和 “innodb_log_group_ho ...
随机推荐
- 【AMAD】django-silk -- 为Django提供如丝般顺滑的性能测量
动机 简介 个人评分 动机 Django作为一个web框架,进行性能测量是很复杂的,不可以使用传统的程序profile工具. 因为,web app的性能是多维度的,不仅仅是代码执行效率,还包括网络延时 ...
- spring5源码分析系列(一)——spring5框架模块
spring总共大约20个模块,这些模块被整合在核心容器(Core Container).AOP和设备支持.数据访问及集成.Web.报文发送.Test 6个模块集合. 组成Spring框架的每个模块集 ...
- [转帖]IBM收购红帽价格是多少?是否会形成垄断企业?会存在什么不安因素?
http://www.techweb.com.cn/it/2019-07-10/2743776.shtml 国产的linux 用centos源的 如何是好呢.. 蓝色巨人IBM官方宣布,已经正式完成对 ...
- NIKKEI Programming Contest 2019-2 Task E. Non-triangular Triplets
$\require{enclose}$ 必要条件 一方面 $\sum_{i=1}^{N}(a_i + b_i) \le \sum_{i=1}^{N} c_i \implies 2\sum_{i=1}^ ...
- 链表--笔记--数据结构(C++版)王红梅--自我思路整理与梳理
看到这篇文的很多人大概都知道链表是个什么玩意了.简单说就是一个又一个的指针,指针之间用指针连接起来. 本文的阅读 适合有c++基础的人群 以下: 这叫做一个结点. 这就是一个链表.我们主要使用的是 ...
- 从入门到自闭之Python编码
ascii码: 支持英文,数字,符号 1字节 不支持中文 gbk(国标) 支持英文,数字,符号 1字节 支持中文 2字节 unicode(万国码): 支持英文,数字,符号 4字节 支持欧洲 4字节 支 ...
- Linux-1.3目录结构,基础命令
1.Linux目录结构 2.Linux基础命令(常用) ctrl+alt+T(打开终端) cd 切换文件夹(pwd查看当前目录) cd /home 绝对路径 以根目录开头 cd admin 相对路径 ...
- Linux安全审计
Client: OMAudit_agent.py #!/usr/bin/env python #coding:utf- import sys import socket import fcntl im ...
- Codeforces 1228C. Primes and Multiplication
传送门 当然是考虑 $n$ 的每个质数 $p$ 对答案的贡献 考虑 $p^k$ 在 $[1,m]$ 中出现了几次,显然是 $\left \lfloor \frac{m}{p^k} \right \rf ...
- CF1151F Sonya and Informatics
cf luogu 我们最终要的序列一定是前面全是0,后面全是1,假设总共\(m\)个0,那么这等价于前\(m\)位0的个数为\(m\).当然一开始可能数量没有\(m\) 那就把前\(m\)位0的数量作 ...