事务

Riicarus大约 2 分钟计算机科学数据库数据库MySQL

事务

什么是事务?

事务通常由一个或者一组 SQL 操作组成, 满足 ACID 原则.

什么是 ACID?

ACID 原则是关系型数据库必须遵守的原则.
ACID 包括:

  • Atomicity: 原子性
    事务中的操作视作一个整体, 要么全部执行, 要么全部不执行.
  • Consistency: 一致性
    数据库中的数据只能从一个一致性状态, 转换到另一个一致性状态. 即: 事务中的数据要么都成功更改, 要么都不被更改.
  • Isolation: 隔离性
    事务之间是独立的, 互不影响. 一个未完成事务不会影响另一个未完成事务.
  • Durability: 持久性
    事务一旦被提交, 数据更改就会被持久化保存.

事务的开启与关闭

  • 使用 start transaction, begin, begin work 来开始事务.
  • 使用 commit 来提交一个事务.
  • 使用 rollback 来回滚一个事务.

事务回滚点

  • 使用 savepoint point_name 来定义回滚点.
  • 使用 rollback to point_name 来回滚事务到回滚点.

事务隔离级别

  • 读未提交--脏读问题

  • 读已提交--不可重复读问题

  • 可重复读(MySQL 默认)--幻读问题

  • 串行化

  • 脏读: 读取到事务未提交的数据.

  • 不可重复读: 读取到其他事务新提交的数据.

  • 幻读: 另一个事务在一个事务要处理的数据范围内新增了数据, 并且先于第一个事务提交.

读未提交

基于写互斥锁实现. 多个事务对同一个数据进行写操作时, 需要先获取互斥锁; 但是读操作不受影响.

读已提交

同样使用写互斥锁. 但是对读操作加入了MVCC多版本并发控制处理, 在每次进行读操作时, 都会创建一个 ReadView, 包含最近一次事务提交的数据版本.

可重复读

同样使用写互斥锁 + MVCC, 但是在一次事务中, 只会在第一次读数据时创建 ReadView, 因此之后所有读操作读到的数据都是一致的.

串行化

使用表锁, 让所有事务排队, 同一时间只能由一个事务在进行操作.