没有合适的资源?快使用搜索试试~ 我知道了~
事务的隔离级别与MVCC.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 118 浏览量
2022-07-08
11:37:47
上传
评论
收藏 5.08MB DOC 举报
温馨提示
试读
25页
事务的隔离级别与MVCC.doc
资源推荐
资源详情
资源评论
事务的隔离级别与 MVCC
提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的
ACID,不知道你有没有想过这个问题,事务有原子性、隔离性、一致性和持久性四大特性,
为什么偏偏给隔离性设置了级别? 一切还得从事务说起。
提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的 ACID,不知道
你有没有想过这个问题,事务有原子性、隔离性、一致性和持久性四大特性,为什么偏偏给
隔离性设置了级别?
一切还得从事务说起。
1. 事务(transaction)的起源
学习数据库事务的时候,一个典型的案例就是「转账」,这篇文章也不能免俗,故事就从
招财向陀螺借 100 块钱开始吧。
一个看似非常简单的现实世界的状态转换,转换成数据库中的操作却并没有那么单纯。这
个看起来很简单的借钱操作至少包含了两个动作:
陀螺的账户余额-100
招财的账户余额+100
要保证转账操作的成功,数据库必须把这两个操作作为一个逻辑整体来执行,这个逻辑整
体就是一个事务。
1.1. 事务的定义
事务就是包含有限个(单条或多条)数据库操作(增删改查)的、最小的逻辑工作单元
(不可再分)。
说到这里不得不吐槽一下,事务的英文是 transaction,直译为“交易”的意思,但是不知道
为什么被意译成了“事务”,让人很难从字面上理解这个概念的含义。
中国人对翻译的“信达雅”的偏执在计算机领域或多或少有点不讨喜。
1.2. 哪些存储引擎支持事务
并不是所有的数据库或者所有的存储引擎都支持事务。
对于 MySQL 而言,事务作为一种功能特性由存储引擎提供。目前支持事务功能的存储引
擎只有 InnoDB 和 NDB,鉴于 InnoDB 目前是 MySQL 默认的存储引擎,我们的研究重点自
然也就是 InnoDB 存储引擎了。
因此文章接下来默认的存储引擎就是 InnoDB,特殊情况下会特别指出。
那么 InnoDB 在什么情况下才会出现事务呢?
2. MySQL 的事务语法
如果你不是 DBA,在平时和 MySQL 的交互中你可能极少直接使用到它的事务语法,一
切都被编程框架封装得很好了。但是现在我们要直接使用 MySQL 进行事务的研究了,抛开
框架,跟我稍微回顾一下语法,这是非常必要的。
2.1. 自动提交
当我运行这样单独一条更新语句的时候,它会有事务吗?
UPDATE user_innodb SET name = ‘蝉沐风’ WHERE id = 1;
实际上,这条语句不仅会自动开启一个事务,而且执行完毕之后还会自动提交事务,并持
久化数据。
这是 MySQL 默认情况下使用的方式——自动提交。在此方式下,增删改的 SQL 语句会
自动开启事务,并且是一条 SQL 一个事务。
自动提交的方式虽然简单,但是对于转账这种涉及到多条 SQL 的业务,就不太适合了。
因此,MySQL 提供了手动开启事务的方法。
2.2. 手动操作事务
2.2.1. 开启事务
可以使用下面两种语句开启一个事务
BEGIN
START TRANSACTION
对比 BEGIN 而言,START TRANSACTION 后面可以添加一些操作符,不过这不是我们
的研究重点,可以不必理会。
2.2.2. 提交或回滚
开启事务之后就可以继续编写需要放到当前事务中的 SQL 语句了。当写完最后一条语句,
如果你觉得写得没问题,你可以提交事务;反之你后悔了,想把数据库恢复到之前的状态,
你可以回滚事务。
提交事务 COMMIT
回滚事务 ROLLBACK
2.3. autocommit 系统变量
MySQL 提供了一个叫做 autocommit 的系统变量,用来表示是否开启自动提交:
mysql> SHOW VARIABLES LIKE ‘autocommit’;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
autocommit 的默认值为 ON,表示默认开启自动提交。但是自动提交和手动操作事务并不
冲突,如果不显式使用 BEGIN 或 START TRANSACTION 开启一个事务,那么 InnoDB 会
在每一条增删改语句执行之后提交事务。
如果我们把 autocommit 设为 OFF,除非我们手动使用 BEGIN 或 START TRANSACTION
开启一个事务,否则 InnoDB 绝不会自动开启事务;同样,除非我们使用 COMMIT 或
ROLLBACK 提交或回滚事务,否则 InnoDB 不会自动结束事务。
实际上,InnoDB 会因为某些特殊语句的执行或客户端连接断开等特殊情况而导致事务自
动提交(即使我们没有手动输入 COMMIT),这种情况叫做隐式提交。
3. 事务并发执行导致的读问题
MySQL 会使用独立的线程处理每一个客户端的连接,这就是多线程。每个线程都可以开
启事务,这就是事务的并发。
不管是多线程的并发执行还是事务的并发执行(其实本质上是一回事儿),如果不采取点
措施,都会带来一些问题。
3.1. 脏读
假设事务 T1 和 T2 并发执行,都要访问 user_innodb 表中 id 为 1 的数据,不同的是 T1 先
读取数据,紧接着 T2 修改了数据的 name 字段,需要注意的是,T2 并没有提交!
此时,T1 再次执行相同的查询操作,会发现数据发生了变化,name 字段由「王刚蛋」变
成了「蝉沐风」。
如果一个事务读到了另一个未提交事务修改过的数据,而导致了前后两次读取的数据不一
致的情况,这种事务并发问题叫做脏读。
3.2. 不可重复读
同样是 T1 和 T2 两个事务,T1 通过 id=1 查询到了一条数据,然后 T2 紧接着 UPDATE
(DELETE 也可以)了该条记录,不同的是,T2 紧接着通过 COMMIT 提交了事务。
剩余24页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2837
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功