SQLite 事务(Transaction)
                           
天天向上
发布: 2025-03-04 20:37:39

原创
285 人浏览过

在 SQLite 中,事务(Transaction) 是一组操作的集合,这些操作要么全部成功执行,要么全部回滚。事务用于保证数据库操作的原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability),通常被称为 ACID 特性。

1. 事务的基本概念

  • 原子性:事务中的所有操作要么都成功执行,要么都不执行。
  • 一致性:事务执行前后,数据库的数据始终保持一致性。
  • 隔离性:事务之间的执行不会相互影响,一个事务的执行不会干扰其他事务。
  • 持久性:一旦事务成功执行,它对数据库的改变是永久性的,即使发生系统崩溃。

2. SQLite 事务命令

SQLite 使用 BEGIN, COMMITROLLBACK 命令来管理事务。

2.1 开始事务(BEGIN

BEGIN TRANSACTION 用于开始一个事务。你可以在事务内执行多个 SQL 操作,直到你决定提交或回滚。

语法

BEGIN TRANSACTION;

示例

BEGIN TRANSACTION;
INSERT INTO employees (id, first_name, last_name) VALUES (1, 'John', 'Doe');
UPDATE employees SET last_name = 'Smith' WHERE id = 1;

2.2 提交事务(COMMIT

COMMIT 用于提交当前事务,这意味着所有在该事务内执行的操作将永久生效。

语法

COMMIT;

示例

COMMIT;

执行这个命令后,事务中的所有修改将保存到数据库中。

2.3 回滚事务(ROLLBACK

ROLLBACK 用于撤销当前事务中的所有操作。如果在事务中发生错误,或者你决定不执行某些操作,可以回滚事务以撤销之前的更改。

语法

ROLLBACK;

示例

ROLLBACK;

执行这个命令后,所有在该事务中的更改将被撤销,数据库回到事务开始之前的状态。

3. 自动提交模式

SQLite 默认启用自动提交模式。在这种模式下,每个独立的 SQL 语句都会被视为一个独立的事务。这意味着如果你没有显式地开始一个事务,SQLite 会在每个语句执行后自动提交它。

例如,以下两个操作将分别被视为独立的事务:

INSERT INTO employees (id, first_name, last_name) VALUES (1, 'John', 'Doe');
UPDATE employees SET last_name = 'Smith' WHERE id = 1;

如果你想显式控制事务的开始和结束,可以使用 BEGIN TRANSACTIONCOMMITROLLBACK

4. 事务示例

以下是一个完整的事务操作示例:

示例: 使用事务插入数据

BEGIN TRANSACTION;

INSERT INTO employees (id, first_name, last_name) VALUES (1, 'John', 'Doe');
INSERT INTO employees (id, first_name, last_name) VALUES (2, 'Jane', 'Doe');

COMMIT;

在这个例子中,两个 INSERT 操作都在一个事务中执行,如果没有问题,COMMIT 会提交更改。如果在 INSERT 过程中发生任何错误,你可以使用 ROLLBACK 来撤销所有操作:

BEGIN TRANSACTION;

INSERT INTO employees (id, first_name, last_name) VALUES (1, 'John', 'Doe');
INSERT INTO employees (id, first_name, last_name) VALUES (2, 'Jane', 'Doe');

-- 假设第二个 INSERT 失败
ROLLBACK;

在这个例子中,ROLLBACK 会撤销所有插入操作,数据库恢复到事务开始之前的状态。

5. 事务的使用场景

事务通常用于以下场景:

  • 多个步骤操作:当一组操作必须作为一个整体进行时(例如,转账操作:从一个账户中扣款并向另一个账户存款)。
  • 确保数据一致性:确保在一组相关的数据库操作中,如果有任何一项失败,所有操作都不会对数据库产生影响。

6. 事务的隔离级别

SQLite 支持几种隔离级别,控制事务之间的并发行为:

  • DEFERRED(默认):事务会推迟锁定,直到它需要进行写操作为止。在事务开始时,SQLite 不会立即锁定数据库,直到执行修改操作时才会锁定。
  • IMMEDIATE:当事务开始时,SQLite 会立即获取写锁,直到事务完成为止。这样可以避免其他事务对数据库进行修改。
  • EXCLUSIVE:当事务开始时,SQLite 会立即获取数据库的独占锁,其他事务将无法执行任何写操作,直到当前事务完成。

示例:

BEGIN DEFERRED TRANSACTION;
-- 执行一些查询或更新操作
COMMIT;

7. 总结

  • 事务命令BEGIN TRANSACTION, COMMIT, ROLLBACK 用于控制事务的开始、提交和回滚。
  • ACID 特性:事务确保数据库操作的原子性、一致性、隔离性和持久性。
  • 自动提交:默认情况下,SQLite 是自动提交模式,执行每个 SQL 语句会隐式提交事务。
  • 隔离级别:SQLite 提供了三种事务隔离级别:DEFERRED(默认)、IMMEDIATEEXCLUSIVE

事务在数据库中非常重要,特别是在涉及多个操作需要确保一致性和完整性的情况下,使用事务可以避免数据不一致或中断操作。更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *