没有合适的资源?快使用搜索试试~ 我知道了~
TrubleYou#ZXBlog#3_事务隔离-为什么你改了我还看不见1
需积分: 0 0 下载量 165 浏览量
2022-07-25
14:34:56
上传
评论
收藏 11KB MD 举报
温馨提示
试读
1、显式启动事务语句, begin 或 start transaction 2、set autocommit=0,这个命令会将这个线程的自动提交关掉 1、务的特
资源推荐
资源详情
资源评论
# 事务隔离: 为什么你改了我还看不见
事务最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。
转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?
**简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败**。
## 一、隔离性与隔离级别
提到事务,你肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中I,也就是“隔离性”。
当数据库上有**多个事务同时执行**的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。
在谈隔离级别之前,你首先要知道,你**隔离得越严实,效率就会越低**。
因此很多时候,我们都要在二者之间寻找一个平衡点。SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。下面逐一解释:
- 读未提交是指,**一个事务还没提交时,它做的变更就能被别的事务看到**。
- 读提交是指,一个事务提交**之后**,它做的变更**才**会被其他事务看到。
- 可重复读是指,**一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的**。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
- 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
看个实例: 假设数据表T中只有一列,其中一行的值为1,下面是按照时间顺序执行两个事务的行为。
```mysql
mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);
```
按照时间顺序执行的事务:
![1557033944906](assets/1557033944906.png)
我们来看看在不同的隔离级别下,事务A会有哪些不同的返回结果,也就是图里面V1、V2、V3的返回值分别是什么。
* 若隔离级别是“读未提交”, 则V1的值就是2。这时候事务B虽然还没有提交,但是结果已经被A看到了。因此,V2、V3也都是2;
* 若隔离级别是“读提交”,则V1是1,V2的值是2。事务B的更新在提交后才能被A看到。所以, V3的值也是2。
* 若隔离级别是“可重复读”,则V1、V2是1,V3是2。之所以V2还是1,遵循的就是这个要求:**事务在执行期间看到的数据前后必须是一致的**。
* 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。所以从A的角度看, V1、V2值是1,V3的值是2
点击阅读更多
资源评论
有只风车子
- 粉丝: 31
- 资源: 329
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功