MySQL中的事务
事务的定义
概念:数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。
就我的理解来说:简单的说事务就是一组同时执行成功或者同时执行失败的数据库操作命令。
事务的分类
-
只读事务
- 开启方式:
START TRANSACTION READ ONLY
语句开启一个只读事务 - 特点:
- 只读事务中不可以对普通的表(其他事务也能访问到的表)进行增、删、改操作
- 但可以对用户临时表做增、删、改操作
- 开启方式:
【拓展】数据库中的临时表(出现在MySQL的3.23版本以后)
- 作用:临时表有时候对于保存临时数据非常有用。临时表可以和普通表一样的进行操作,并且在当前的终端会话结束后被删除。
- 操作:
- 表创建:
CREATE TEMPORARY TABLE tableName
- 表删除:
DROP TABLE tableName;
-
读写事务(默认使用类型)
- 开启方式:
START TRANSACTION READ WRITE
语句开启一个读写事务或者直接使用 BEGIN、START TRANSACTION
开启
我们默认使用的就是读写事务
- 特点:对普通表可以进行任何操作
- 开启方式:
事务的特性(ACID)
-
原子性(Atomicity):
- 概念:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
- 我的理解:同一个事务中的操作最终执行状态一样(一组操作要么都成功,要么都失败)
-
持久性(Durable)
- 概念:持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
- 我的理解:一个事务中的修改内容可以永久的在磁盘中进行保存,即使系统出现故障也可以进行持久保存
-
隔离性(Isolation)
- 概念:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 我的理解:每个事务的执行时互不影响,保证并发场景下的“环境独立”
-
一致性(Consistent)
- 概念:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 我的理解:事务中更改的数据最终会保证所有数据读取出的结果和磁盘中的数据保证一致
特性之间的关系
事务中最重要的特性其实时一致性,一致性是开始事务的最终目的,而原子性、隔离性和持久性都是实现一致性的手段
事务实现的方式
WAL日志预写
先将修改内容写入到日志中,然后再同步到系统磁盘中,InnoDB就是通过这种方式实现的,日志包括undo log和redo log来实现事务;其中数据落盘成功前也可以进行数据的改动。
MySQL的InnoDB的事务就是使用这种方式实现的。
Commit Log提交日志
在日志落盘成功后才进行数据的修改;必须落盘成功再进行数据修改。
OceanBase数据库就使用的这种方式实现的。
Shadow Paging影子分页
使用写时复制的机制实现,再进修改操作时对修改数据做一个复制操作,在复制区域进行修改,修改完成后再进行内容的替换。
安卓开发中SQLLitte就是通过这种方式实现的。