事务
- 原子性(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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。