事务 (Transaction)
若在遇到 COMMIT
前有操作失败或遇到 ROLLBACK
, 则自动撤回事务内的全部操作.
ACID
事务通常具有 ACID 属性. 其中的字母分别表示:
- 原子性 (Atomicity): 原子性确保事务里的所有操作要么全部成功, 要么全部失败. 以确保数据的一致性.
- 一致性 (Consistency).
- 隔离性 (Isolation): 隔离性确保并发执行事务的最终效果与顺序执行事务相同.
-
持久性 (Durability): 持久性确保事务提交后, 即使立即发生系统故障(例如停电或崩溃), 也会保持提交状态.
通常, DBMS 会利用延迟写 (Delayed write) 机制提高性能, 即在修改内存中的数据后, 延迟更新磁盘中的数据.
但故障发生时, 内存中还未更新到磁盘的数据将丢失.为保证持久性, DBMS 会利用Write-ahead logging (WAL) 机制, 先永久记录要执行的操作, 再执行这些操作.
这样即使发生故障, 也能通过磁盘里的记录, 恢复内存中的数据.结合延迟写和 WAL 机制, DBMS 可以在确保持久性的情况下, 高效的进行事务处理.
在 SQLite 中, 事务还可以用来提高批量操作的效率. 比如多条 INSERT
语句原本需要多次写入文件, 利用事务, 可以一次性将全部修改写入文件, 极大的提高了执行效率.
调度
符号
- \(r_i(X)\): 事务 \(i\) 读取 \(X\).
- \(w_i(X)\): 事务 \(i\) 写入 \(X\).
- \(c_i(X)\): 事务 \(i\) 提交.
调度类型
- 串行 (Serial): 事务串行执行.
- 可串行化 (Serializable): 如果执行结果与串行相同, 则表示该调度是可串行化.