




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MySQLMySQL 事务隔离级别详解事务隔离级别详解 SQL 标准定义了 4 类隔离级别 包括了一些具体规则 用来限定事务内外 的哪些改变是可见的 哪些是不可见的 低级别的隔离级一般支持更高的 并发处理 并拥有更低的系统开销 ReadRead UncommittedUncommitted 读取未提交内容 读取未提交内容 在该隔离级别 所有事务都可以看到其他未提交事务的执行结果 本隔 离级别很少用于实际应用 因为它的性能也不比其他级别好多少 读取未 提交的数据 也被称之为脏读 Dirty Read ReadRead CommittedCommitted 读取提交内容 读取提交内容 这是大多数数据库系统的默认隔离级别 但不是 MySQL 默认的 它满 足了隔离的简单定义 一个事务只能看见已经提交事务所做的改变 这种 隔离级别 也支持所谓的不可重复读 Nonrepeatable Read 因为同一 事务的其他实例在该实例处理其间可能会有新的 commit 所以同一 select 可能返回不同结果 RepeatableRepeatable ReadRead 可重读 可重读 这是 MySQL 的默认事务隔离级别 它确保同一事务的多个实例在并发读 取数据时 会看到同样的数据行 不过理论上 这会导致另一个棘手的问 题 幻读 Phantom Read 简单的说 幻读指当用户读取某一范围的 数据行时 另一个事务又在该范围内插入了新行 当用户再读取该范围的 数据行时 会发现有新的 幻影 行 InnoDB 和 Falcon 存储引擎通过 多版本并发控制 MVCC Multiversion Concurrency Control 机制解决 了该问题 SerializableSerializable 可串行化 可串行化 这是最高的隔离级别 它通过强制事务排序 使之不可能相互冲突 从 而解决幻读问题 简言之 它是在每个读的数据行上加上共享锁 在这个 级别 可能导致大量的超时现象和锁竞争 这四种隔离级别采取不同的锁类型来实现 若读取的是同一个数据的话 就容易发生问题 例如 脏读 Drity Read 某个事务已更新一份数据 另一个事务在此时读取 了同一份数据 由于某些原因 前一个 RollBack 了操作 则后一个事务 所读取的数据就会是不正确的 不可重复读 Non repeatable read 在一个事务的两次查询之中数据不 一致 这可能是两次查询过程中间插入了一个事务更新的原有的数据 幻读 Phantom Read 在一个事务的两次查询中数据笔数不一致 例如 有一个事务查询了几列 Row 数据 而另一个事务却在此时插入了新的几 列数据 先前的事务在接下来的查询中 就会发现有几列数据是它先前所 没有的 在 MySQL 中 实现了这四种隔离级别 分别有可能产生问题如下所示 下面 将利用 MySQL 的客户端程序 分别测试几种隔离级别 测试数据库 为 test 表为 test 表结构 id int num int CmdCmd line line mysql uroot p Use test SELECT tx isolation set session transaction isolation level read uncommitted set autocommit off start transaction 两个命令行客户端分别为 A B 不断改变 A 的隔离级别 在 B 端修改数 据 一 将 一 将 A A 的隔离级别设置为的隔离级别设置为 readread uncommitted uncommitted 未提交读未提交读 setset sessionsession transactiontransaction isolationisolation levellevel readread uncommitted uncommitted 在 B 未更新数据之前 客户端客户端 A A B 更新数据 客户端客户端 B B 客户端客户端 A A 经过上面的实验可以得出结论 事务 B 更新了一条记录 但是没有提交 此时事务 A 可以查询出未提交记录 造成脏读现象 未提交读是最低的隔 离级别 二 将客户端 二 将客户端 A A 的事务隔离级别设置为的事务隔离级别设置为 readread committed committed 已提交读已提交读 set session transaction isolation level read committed 在 B 未更新数据之前 客户端客户端 A A B 更新数据 客户端客户端 B B 客户端客户端 A A 客户端客户端 B B 客户端客户端 A A 客户端客户端 B B 客户端客户端 A A 经过上面的实验可以得出结论 已提交读隔离级别解决了脏读的问题 但是出现了不可重复读的问题 即事务 A 在两次查询的数据不一致 因为 在两次查询之间事务 B 更新了一条数据 已提交读只允许读取已提交的记 录 但不要求可重复读 三 将将 A A 的隔离级别设置为的隔离级别设置为 repeatablerepeatable read read 可重复读可重复读 set session transaction isolation level repeatable read 在 B 未更新数据之前 客户端客户端 A A B 更新数据 客户端客户端 B B 客户端客户端 A A 客户端客户端 A A 提交 重新开始事物 提交 重新开始事物 由以上的实验可以得出结论 可重复读隔离级别只允许读取已提交记录 而且在一个事务两次读取一个记录期间 其他事务部的更新该记录 但该 事务不要求与其他 事务可串行化 例如 当一个事务可以找到由一个已 提交事务更新的记录 但是可能产生幻读问题 注意是可能 因为数据库 对隔离级别的实现有所差别 像以上 的实验 就没有出现数据幻读的问 题 四四 将将 A A 的隔离级别设置为的隔离级别设置为 可串行化可串行化 Serializable Serializable set session transaction isolation level SerializableSerializable A A 端打开事务 端打开事务 B B 端插入一条记录端插入一条记录 事务事务 A A 端 端 事务事务 B B 端 端 因为此时事务 A 的隔离级别设置为 serializable 开始事务后 并没有 提交 所以事务 B 只能等待 事务事务 A A 提交事务 提交事务 事务事务 A A 端端 事务事务 B B 端端 serializable 完全锁定字段 若一个事务来查询同一份数据就必须等 待 直到前一个事务完成并解除锁定为止 是完整的隔离级别 会锁定 对应的数据表格 因而会有效率的问题 MySQL InnoDB 存储引擎的事务隔离级别存储引擎的事务隔离级别 我们知道 在关系数据库标准中有四个事务隔离级别 未提交读 Read Uncommitted 允许脏读 也就是可能读取到其他会话中未 提交事务修改的数据 提交读 Read Committed 只能读取到已经提交的数据 Oracle 等多数数 据库默认都是该级别 可重复读 Repeated Read 可重复读 在同一个事务内的查询都是事务开 始时刻一致的 InnoDBInnoDB 默认级别默认级别 在 SQL 标准中 该隔离级别消除了不可 重复读 但是还存在幻象读 串行读 Serializable 完全串行化的读 每次读都需要获得表级共享锁 读写相互都会阻塞 查看 InnoDB 系统级别的事务隔离级别 mysql SELECT global tx isolation global tx isolation REPEATABLE READ 1 row in set 0 00 sec 查看 InnoDB 会话级别的事务隔离级别 mysql SELECT tx isolation tx isolation REPEATABLE READ 1 row in set 0 00 sec 修改事务隔离级别 mysql set global transaction isolation level read committed Query OK 0 rows affected 0 00 sec mysql set session transaction isolation level read committed Query OK 0 rows affected 0 00 sec InnoDB 的可重复读隔离级别和其他数据库的可重复读是有区别的 不会造成幻象 读 phantom read 所谓幻象读 就是同一个事务内 多次 select 可以读取 到其他 session insert 并已经 commit 的数据 下面是一个小的测试 证明 InnoDB 的可重复读隔离级别不会造成幻象读 测试涉及两个 session 分别为 session 1 和 session 2 隔离级别都是 repeateable read 关闭 autocommit mysql select tx isolation tx isolation REPEATABLE READ 1 row in set 0 00 sec mysql set autocommit off Query OK 0 rows affected 0 00 sec session 1 创建表并插入测试数据 mysql create table test i int engine innodb Query OK 0 rows affected 0 00 sec mysql insert into test values 1 Query OK 1 row affected 0 00 sec session 2 查询 没有数据 正常 session1 没有提交 不允许脏读 mysql select from test Empty set 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025权益变更转让合同
- 现代管理学的人际关系试题及答案
- 2025关于解除特许经营合同协议书
- 行政管理的评价方法与案例研究试题及答案
- 工程项目预算执行过程分析试题及答案
- 社区参与与市政治理能力提升试题及答案
- 2025电竞馆合作合同标准模板
- 公文处理的实务技能与考试试题及答案
- 行政管理与市政危机应对试题及答案
- 区块链BaaS云平台介绍
- 教师个人成长档案电子模板
- 《连续性肾替代治疗容量评估与管理专家共识》解读课件
- 工程勘察收费标准
- DB11T 1399-2017 城市道路与管线地下病害探测及评价技术规范
- 德意莎门窗授权经销商合作协议书(代理商合作协议空白版)
- 大国兵器学习通超星期末考试答案章节答案2024年
- DB35T 2212-2024消防远程监控系统技术要求
- 班级音乐会主题班会
- 东亚飞蝗标准化养殖示范基地建设项目可行性实施报告
- 抖音本地生活商家直播培训
- 陕西省2024年中考地理试卷(附解析)
评论
0/150
提交评论