Skip to content

Latest commit

 

History

History
47 lines (31 loc) · 2.17 KB

82.10、SQL 事务.adoc

File metadata and controls

47 lines (31 loc) · 2.17 KB

SQL 事务

SQLite 是一个事务性(transactional)的数据库,所有的修改和查询均是原子化的(Atomic)、一致的(Consistent)、独立的(Isolation)、持久的(Durable),简称 ACID

  • 原子化的:
    数据库事务应该是原子化的。它表示一个修改不可以被分解为更小的部分。当你提交一个事务后,该事务要么完整被执行,要么完全没有被执行

  • 一致的:
    一个事务必须保证将数据库从一个有效状态转移至另一个有效状态。当一个事务开始、并执行了一个修改数据的数据库开始变得不一致,但当整个事务完成亦或回滚后,事务应该保证数据库的一致性。

  • 独立的:
    一个会话正在执行的事务,必须对其它会话保持独立。当一个会话开始一个事务,并执行 INSERTUPDATE 语句修改数据时,这些修改仅能被当前会话看到,其它会话不能看到。换句话说,若当前会话已经开始了一个事务,那么在这之后,其它会话对数据库做出的修改,不应该被当前会话看见。

  • 持久性:
    若一个事务成功执行,那么无论环境状态,比如电源事故或程序崩溃,该事务在数据库中必须为永存的。反过来说,若程序在事务完成前崩溃,那么任何修改都不应该生效。

TRANSACTION 语句

默认情况下,SQLite 处于自动提交模式。也就是说,对于每个命令,SQLite 会自动对该事务执行 启动、处理、提交的流程。

要明确开始一次事务,使用如下的步骤:

首先通过如下的语句开始一个事务

BEGIN TRANSACTION; -- 可以简写为 BEGIN;

在执行完上面的语句之后,该事务会保持开启状态,直到该事务被明确地提交或回滚。

之后,可以发送 select 或 update 数据库。注意,修改仅在当前会话中可见。

最后,使用下面的语句提交修改

COMMIT TRANSACTION; -- 可以简写为 COMMIT;

若你不希望保存修改,使用下面的语句回滚:

ROLLBACK TRANSACTION; -- 可以简写为 ROLLBACK;