mysql 系列(3)-事务与MVCC
事务
文章图片
- 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
- 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如 A 向 B 转账,不可能 A 扣了钱,B 却没收到。
- 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
- 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
查看和更改事务隔离级别修改隔离级别语句格式是:set [作用域] transaction isolation level [事务隔离级别]。其中作用域可选:SESSION(会话)、GLOBAL(全局)
Your MySQL connection id is 19
Server version: 5.7.34 MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;
' or '\h' for help. Type '\c' to clear the current input statement.mysql> SELECT @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ|
+-------------------------+
1 row in set (0.00 sec)mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED|
+-------------------------+
1 row in set (0.00 sec)mysql>
下图按照时间执行两个事务
create table T(c int) engine=InnoDB;
insert into T(c) values(1);
文章图片
隔离级别
- 读未提交: V1=2,V2=2,V3=2
- 读提交: V1=1,V2=2,V3=2
- 可重复读: V1=1,V2=1,V3=2
- 串行化: V1=1,V2=1,V3=2
串行化则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事 务 A 提交后,事务 B 才可以继续执行
在“可重复 读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。
在“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;
而“串行 化”隔离级别下直接用加锁的方式来避免并行访问。
MVCC构成
- 隐藏字段:
DB_TRX_ID 创建这条记录的事务id或者最后一次修改的事务id
DB_ROLL_PTR 回滚指针, 指向这条记录的上一个版本
DB_ROW_ID 隐藏主键, 如果没有主键,会生成一个6字节的row_id - undo log
快照读 读历史
文章图片
- reaview
文章图片
文章图片
推荐阅读
- 【欢喜是你·三宅系列①】⑶
- 你不可不知的真相系列之科学
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 2018-06-13金句系列7(金句结构-改编古现代诗词)
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- py连接mysql
- 2019-01-18Mysql中主机名的问题
- MySql数据库备份与恢复
- 乡野村趣系列之烧仙草
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)