跳转至

事务 (Transaction)

START TRANSACTION; -- 开始事务

... SKIP ...

ROLLBACK;  -- 撤销所有更改
COMMIT;    -- 提交事务, 保存更改

若在遇到 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): 如果执行结果与串行相同, 则表示该调度是可串行化.

参考

评论