14.5.2 InnoDB Transaction Model 14.5.2.1 Transaction Isolation Levels 14.5.2.2 autocommit, Commit, and Rollback 14.5.2.3 Consistent Nonlocking Reads 14.5.2.4 Locking Reads 在InnoDB 事务模型中, 目标是将一个多版本的数据库和传统的2阶段锁结合起来。 InnoDB 执行lock 在行级别,运行查询作为非锁定一致读(默认情况下), 类似Oracle风格。 锁的信息在InnoDB 是存储空间的这样lock 不会升级。 通常情况下, 几个用户是允许锁定每条记录在InnoDB 表,或者任何随机的行集合不会导致InnoDB 内存耗尽 14.5.2.1 Transaction Isolation Levels 事务隔离级别 事务隔离是数据库处理的基础之一,隔离是ACID 中I的缩写, 隔离级别是设置调优平衡在性能和可靠性上,一致性,结果的可重复性当多个事务是做改变和执行查询在同一书剑 InnoDB 提供所有四种隔离级别 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, and SERIALIZABLE. 默认的隔离级别是RR 一个用户可以改变单个session的隔离级别用于后续的连接使用SET TRANSACTION 语句。 来设置默认的隔离级别用于所有的连接,使用 --transaction-isolation选项在命令行或者在一个选项文件。 InnoDB 支持每个事务隔离级别使用不同的锁策略。 你可以实行一个高一致性使用默认的REPEATABLE READ级别, 对于操作在关键数据 那么ACID的遵守是重要的。 或者你可以放松一致性规则使用READ COMMITTED or even READ UNCOMMITTED, 在这种情况下比如大部分报告精确的一致和重复结果是相对不重要 可以最小化锁的数量 下面的列表描述MySQL支持不同的事务隔离: REPEATABLE READ: 默认的隔离级别, 对于一致性读, 有一个重要的不同对于 READ COMMITTED isolation level: 所有的一致性读在相同的事务读快照是通过第一次读创建的。 这意味着如果你执行几个普通的SELECT语句在相同的事务里 对于锁定读(SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE, and DELETE statements, 锁依赖是否语句使用一个唯一索引来进行唯一搜索条件,或者一个range-type 搜索条件。 对于一个唯一索引进行唯一搜索条件,InnoDB 只锁定找到的index 记录,不是他之前的区间锁。 对于其他搜索条件,InnoDB 锁定索引范围扫描,使用gap 锁或者next-key locks 来堵塞其他会话的插入到这个区间 READ COMMITTED 一个类似Oracle的隔离级别尊重一致性读,每个一致性读,即使在同一个事务,设置和读它自己最新的快照 对于锁定读(SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE statements, and DELETE statements, InnoDB 只锁定index 记录,没有区间锁,因此允许新的记录插入到靠近被锁记录 注意; 在MySQL 5.6中,当READ COMMITTED隔离模式被使用, 或者过期的 innodb_locks_unsafe_for_binlog 系统变量被启用, 这里没有InnoDB gap 锁 除非对于外键约束检查和重复键检查。