14.3.2 InnoDB Transaction Model  InnoDB 事务模型

14.3.2.1 Transaction Isolation Levels     事务隔离级别
14.3.2.2 autocommit, Commit, and Rollback
14.3.2.3 Consistent Nonlocking Reads 一直非堵塞读
14.3.2.4 Locking Reads 锁定读 在 InnoDB 事务模型里, 目的是结合一个多版本数据库具有2阶段锁定的最好的特性的结合 InnoDB 执行锁定在记录行上 ,查询非锁定一致性读 默认, 类似Oracle数据库的风格。 lock information 在InnoDB 是被存储在有效空间的, 不需要锁升级。 通常情况下,多个用户是允许锁定InnoDB 表的每一行,或者任何随机子集的行,不会造成InnoDB 内存耗尽。 14.3.2.1 Transaction Isolation Levels 事务隔离级别 事务隔离 是数据库处理的基础之一, 事务隔离是ACID 中I的缩写。 事务隔离是很好的调整性能和可靠性的设置,一致性,和重复性的结果 当多个事务再做变化和执行查询在同一时间。 InnoDB 提供所有4种事务隔离级别:READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, and SERIALIZABLE. 默认的隔离级别是REPEATABLE READ. (RR) 一个用户可以改变单个session的隔离级别或者所有随后的连接使用SET TRANSACTION statement. 来设置server的默认的隔离级别对于所有的连接,使用--transaction-isolation选项在命令行 或者一个选项文件。 InnoDB 支持每个事务隔离级别使用不同的锁定策略。 你可以强制一个高程度的一致性读 使用默认的 REPEATABLE READ level 对于关键数据的操作, ACID 规则是重要的, 或者你可以放宽一致性规则 使用 READ COMMITTED or even READ UNCOMMITTED 比如大部分报告 精确的一致性和可重复的结果是不重要的 相比lock的最小化负担。 SERIALIZABLE 强制更严格的规则 相比 REPEATABLE READ 并主要用于特定的场景,比图 XA事务和并发和死锁故障排除。 下面的描述 MySQL 如何支持不同的事务隔离,该列表时从最常用的级别到最少使用的级别: 1. REPEATABLE READ: 这是InnoDB 默认的隔离级别, 对于一致性读,这里有一个重要的不同相比READ COMMITTED isolation level 所有的一致性读在相同的是事务里读取有first read 创建的快照。 这意味着如果你执行几种普通的(非锁定的) SELECT 语句 在相同的事务里, 那些SELECT 语句是一致性的 。 对于lodcking reads(SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE,和DELETE 语句,locking 依赖是否语句使用一个唯一索引进行一个唯一的搜索条件, 或者一个range-type 搜索条件。对于一个unique index 进行一个unique 搜索条件, InnoDB 只锁定index record ,不是在它之前的区间。 对于其他的搜索条件,InnoDB locks 扫描的index range,使用一个gap locks 或者一个Next-key locks 来堵塞其他会话插入到这个区间。 /*****************************示例:
CREATE TABLE `t5` (
`sn` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) DEFAULT NULL,
`info` varchar(40) DEFAULT NULL,
PRIMARY KEY (`sn`)
) Sesson 1: mysql> select * from t5;
+----+------+------+
| sn | id | info |
+----+------+------+
| 1 | 1 | a1 |
| 2 | 5 | a5 |
| 3 | 10 | a10 |
| 4 | 15 | a15 |
| 5 | 20 | a20 |
| 6 | 25 | a25 |
| 7 | 30 | a30 |
| 8 | 35 | a35 |
| 9 | 40 | a40 |
+----+------+------+
9 rows in set (0.00 sec) 创建普通的B树索引:
mysql> create index t5_idx1 on t5(id); mysql> select * from t5 where id=10 for update;
+----+------+------+
| sn | id | info |
+----+------+------+
| 3 | 10 | a10 |
+----+------+------+
1 row in set (0.00 sec) Session 2: mysql> insert into t5(id,info) values(8,'a8');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(9,'a9'); ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql>
mysql>
mysql> insert into t5(id,info) values(7,'a7');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(6,'a6');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(5,'a5');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(4,'a4');
Query OK, 1 row affected (0.00 sec) mysql> insert into t5(id,info) values(3,'a3');
Query OK, 1 row affected (0.00 sec) mysql> insert into t5(id,info) values(2,'a2');
Query OK, 1 row affected (0.00 sec) mysql> insert into t5(id,info) values(1,'a1');
Query OK, 1 row affected (0.00 sec) mysql> insert into t5(id,info) values(10,'a10');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(11,'a11');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(12,'a12');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(13,'a13');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(14,'a14');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into t5(id,info) values(15,'a15');
Query OK, 1 row affected (0.00 sec) mysql> insert into t5(id,info) values(16,'a16');
Query OK, 1 row affected (0.00 sec) 锁的区间是[5,15) 创建唯一索引: Session 1: mysql> show create table t5;
+------- +---------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- -------------------------------------------+
| Table | Create Table |
+------- +---------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- -------------------------------------------+
| t5 | CREATE TABLE `t5` (
`sn` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) DEFAULT NULL,
`info` varchar(40) DEFAULT NULL,
PRIMARY KEY (`sn`),
UNIQUE KEY `t5_idx1` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 |
+------- +---------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- -------------------------------------------+
1 row in set (0.00 sec) mysql> select * from t5 where id=10 for update;
+----+------+------+
| sn | id | info |
+----+------+------+
| 3 | 10 | a10 |
+----+------+------+
1 row in set (0.00 sec) Session 2: mysql> insert into t5(id,info) values(10,'a10');
^[[AERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 只锁ID=10 READ COMMITTED: 一个和Oracle很像的隔离级别尊重一致性读(非堵塞): 每个一致性读, 甚至在相同的会话里,设置和读取它自己的新鲜的快照。 对于锁定读( SELECT with FOR UPDATE or LOCK IN SHARE MODE),UPDATE 语句, 和DELETE 语句,InnoDB 只锁定index records,不是在它们之前的区间,从而允许新的记录自由的插入紧领着 锁定的记录。
注意: 在MySQL 5.6,当READ COMMITTED 隔离级别被使用, 或者过时的innodb_locks_unsafe_for_binlog 系统变量被启用,那么久没有区间锁除了外键越苏检查和重复key检查, 同时, record locks对于不匹配的记录是被释放在MySQL 已经评估WHERE 条件。 READ UNCOMMITTED SELECT 语句是以一种非锁定方式进行, 但是一个可能的早期版本的记录可能被使用。 因此, 使用这个隔离级别, 这种读是不一致的,这个也会被称为脏读。 SERIALIZABLE 序列化: 这个级别很像REPEATABLE READ,但是InnoDB 隐式的转换所有的普通的SELECT 语句为 SELECT ... LOCK IN SHARE MODE 如果自动提交被关闭,如果自动提交开启, SELECT 是它自己的事务。 因此它是只读和序列化如果作为一个一致(非锁定)读和 不需要block 其他的事务

14.3.2.1 Transaction Isolation Levels 事务隔离级别的更多相关文章

  1. Oracle Database Transaction Isolation Levels 事务隔离级别

    Overview of Oracle Database Transaction Isolation Levels Oracle 数据库提供如下事务隔离级别: 已提交读隔离级别 可串行化隔离级别 只读隔 ...

  2. mysql事务隔离级别详解和实战

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

  3. mysql事务隔离级别设置

    设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别: 若没有输入作用域直接修改transaction isolation,显示修改成 ...

  4. 事务的隔离级别和mysql事务隔离级别修改

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

  5. 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...

  6. 面试突击61:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...

  7. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

  8. MSSQL事务隔离级别详解(SET TRANSACTION ISOLATION LEVEL)

    控制到 Transact-SQL 的连接发出的 SQL Server 语句的锁定行为和行版本控制行为. TRANSACT-SQL 语法约定 语法   -- Syntax for SQL Server ...

  9. MySQL数据库事务隔离级别(Transaction Isolation Level)

    转自: http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html  数据库隔离级别有四种,应用<高性能mysql>一书中的 ...

随机推荐

  1. 在mac os 中安装 autoconf and automake

    转载地址:http://www.mattvsworld.com/blog/2010/02/install-the-latest-autoconf-and-automake-on-mac-os-10-6 ...

  2. QT序列化操作(比较复杂和完善)

    应用需求: 在网盘开发过程中有这样一个需求,即对文件版本进行控制,即记录文件版本的更替信息,这里说的更替信息仅仅是记录不同时刻的文件变化,即文件的增.删.改.重命名等操作.在每个待监控的目录下都会保存 ...

  3. iTextSharp - 建立PDF文件

    原文 iTextSharp - 建立PDF文件 01 using iTextSharp.text; 02 using iTextSharp.text.pdf; 03 ... 04 private vo ...

  4. GridView点击空白地方事件扩展

    我们通常在ListView或者GridView响应点击Item事件,但很多时候我们同样也 希望监听到点击空白区域的事件来做更多的处理.本文以GridView为例给出一个实现 的方法,扩展GridVie ...

  5. 在Qt中如何使用QtDesigner创建的UI文件

    使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要 ...

  6. Swift - 设置应用程序图标的提醒个数(右上角小红圈)

    使用UILocalNotification除了可以实现本地消息的推送功能(可以设置推送内容,推送时间,提示音),还可以设置应用程序右上角的提醒个数. 下面演示如何设置,效果图如下: --- AppDe ...

  7. linux命令:find

    先上例子: find ./*_src -type f | xargs grep -ils "date" 在指定的那些文件夹下面,递归寻找包含“date” 字符串的普通文件. fin ...

  8. axure母版(模板)区域介绍

    axure的模板区域是非常重要的一个功能,网站的头部.尾部部分等很多页面同时用到的内容,都可以使用母版,因为在母版中只需要修改一次,就可以实现所有的页面更新,可以大大的加速原型的制作速度.需要重复理解 ...

  9. Redis + Jedis + Spring整合遇到的异常(转)

    项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused b ...

  10. javascript 回调函数应用

    回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你”这是一个异步 ...