事务

image.png

  • 原子性(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);
image.png
隔离级别

  1. 读未提交: V1=2,V2=2,V3=2
  2. 读提交: V1=1,V2=2,V3=2
  3. 可重复读: V1=1,V2=1,V3=2
  4. 串行化: V1=1,V2=1,V3=2
    串行化则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事 务 A 提交后,事务 B 才可以继续执行

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
在“可重复 读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。
在“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;
而“串行 化”隔离级别下直接用加锁的方式来避免并行访问。

MVCC构成

  1. 隐藏字段:
    DB_TRX_ID 创建这条记录的事务id或者最后一次修改的事务id
    DB_ROLL_PTR 回滚指针, 指向这条记录的上一个版本
    DB_ROW_ID 隐藏主键, 如果没有主键,会生成一个6字节的row_id
  2. undo log
    快照读 读历史
  3. reaview


不忌口
12 声望0 粉丝