当前位置: 首页 > news >正文

如何在SQLite中实现事务处理?

文章目录

    • 一、事务的基本操作
      • 1. 开启事务
      • 2. 提交事务
      • 3. 回滚事务
    • 二、事务的使用场景与示例
      • 示例:模拟银行转账
    • 三、事务的特性与注意事项
      • 1. 自动提交模式(默认行为)
      • 2. 事务与性能优化
      • 3. 事务隔离级别
      • 4. 锁机制与并发
    • 四、编程语言中的事务处理示例(以 Python 为例)
    • 总结

在 SQLite 中,事务处理是确保数据操作原子性、一致性、隔离性和持久性(ACID)的关键机制。通过事务,可以将一系列 SQL 操作视为一个不可分割的整体——要么全部成功执行,要么在出现错误时全部回滚,避免数据处于不一致状态。

以下是 SQLite 中事务处理的实现方式和常用操作:

一、事务的基本操作

SQLite 事务通过三个核心命令控制:

1. 开启事务

BEGIN TRANSACTION;  -- 或简写为 BEGIN;

执行该命令后,所有后续的 SQL 操作(INSERT/UPDATE/DELETE 等)都会被纳入当前事务,暂时不会真正写入磁盘,而是先记录在事务日志中。

2. 提交事务

COMMIT;  -- 或 COMMIT TRANSACTION;

提交事务会将当前事务中所有操作的结果永久写入数据库,事务结束。此时,数据变更才会被持久化。

3. 回滚事务

ROLLBACK;  -- 或 ROLLBACK TRANSACTION;

若执行过程中出现错误(如约束冲突、程序崩溃等),可通过回滚放弃当前事务中所有未提交的操作,数据库状态恢复到事务开始前的状态,保证数据一致性。

二、事务的使用场景与示例

事务最适合用于多步操作必须同时成功的场景(如转账:扣减A的余额和增加B的余额必须同时完成)。

示例:模拟银行转账

假设存在 accounts 表:

CREATE TABLE accounts (id INTEGER PRIMARY KEY,name TEXT NOT NULL,balance REAL NOT NULL CHECK (balance >= 0)
);INSERT INTO accounts (name, balance) VALUES ('Alice', 1000), ('Bob', 500);

使用事务确保转账操作的原子性:

-- 开启事务
BEGIN;-- 步骤1:从Alice账户扣减200元
UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice';-- 步骤2:向Bob账户增加200元
UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob';-- 检查操作是否正确(可选)
SELECT * FROM accounts WHERE name IN ('Alice', 'Bob');-- 若一切正常,提交事务
COMMIT;-- 若发现错误(如Alice余额不足),回滚事务
-- ROLLBACK;

如果执行过程中任何一步失败(如 Alice 余额不足导致 CHECK 约束报错),SQLite 会自动回滚事务,避免出现“Alice 钱被扣了但 Bob 没收到”的不一致状态。

三、事务的特性与注意事项

1. 自动提交模式(默认行为)

SQLite 默认处于自动提交模式:如果没有显式开启事务(BEGIN),每个单独的 SQL 语句都会被视为一个独立事务,执行后立即自动提交。

这种模式的问题是:频繁的单条 INSERT/UPDATE 会导致大量磁盘 I/O,性能较低。因此,批量操作必须显式使用事务

2. 事务与性能优化

对大量数据进行操作时,显式事务能大幅提升性能。例如,插入 1000 条数据:

  • 无事务(自动提交):每条插入都会触发一次磁盘写入,速度慢。
  • 有事务:所有插入在内存中完成,最后一次写入磁盘,效率提升 10~100 倍。

示例:批量插入数据

BEGIN;
INSERT INTO users (name) VALUES ('User1');
INSERT INTO users (name) VALUES ('User2');
-- ... 更多插入 ...
INSERT INTO users (name) VALUES ('User1000');
COMMIT;  -- 仅一次磁盘写入

3. 事务隔离级别

SQLite 支持四种事务隔离级别(通过 PRAGMA 设置),默认是 SERIALIZABLE(最高隔离级别,确保并发安全):

-- 查看当前隔离级别
PRAGMA isolation_level;-- 设置隔离级别(需在BEGIN前执行)
PRAGMA isolation_level = 'READ UNCOMMITTED';  -- 最低级别(很少用)
PRAGMA isolation_level = 'READ COMMITTED';
PRAGMA isolation_level = 'REPEATABLE READ';
PRAGMA isolation_level = 'SERIALIZABLE';  -- 默认

4. 锁机制与并发

SQLite 采用“写独占,读共享”的锁机制:

  • 事务执行期间,若有写入操作(INSERT/UPDATE/DELETE),会锁定数据库,其他写入操作需等待当前事务完成(COMMITROLLBACK)。
  • 读操作(SELECT)可并发执行,不受写锁影响(WAL 模式下)。

因此,长时间未提交的事务会阻塞其他写入操作,需避免在事务中执行耗时操作(如复杂查询、用户交互)。

四、编程语言中的事务处理示例(以 Python 为例)

在代码中使用事务时,通常结合异常处理确保出错时自动回滚:
sqlite_transaction_demo.py文件如下:

import sqlite3def transfer_money(db_path, from_name, to_name, amount):conn = Nonetry:# 连接数据库conn = sqlite3.connect(db_path)cursor = conn.cursor()# 开启事务(默认自动提交关闭)conn.execute('BEGIN')# 检查转出账户余额cursor.execute("SELECT balance FROM accounts WHERE name = ?", (from_name,))from_balance = cursor.fetchone()[0]if from_balance < amount:raise ValueError("余额不足,转账失败")# 执行转账操作cursor.execute("UPDATE accounts SET balance = balance - ? WHERE name = ?", (amount, from_name))cursor.execute("UPDATE accounts SET balance = balance + ? WHERE name = ?", (amount, to_name))# 提交事务conn.commit()print("转账成功")except Exception as e:# 出错时回滚if conn:conn.rollback()print(f"转账失败:{str(e)}")finally:# 关闭连接if conn:conn.close()# 调用函数:从Alice向Bob转账300元
transfer_money('bank.db', 'Alice', 'Bob', 300)

总结

SQLite 事务处理的核心是通过 BEGINCOMMITROLLBACK 控制操作的原子性,其主要作用是:

  1. 保证数据一致性,避免部分操作成功、部分失败的中间状态。
  2. 大幅提升批量操作的性能(减少磁盘 I/O)。
  3. 支持并发控制,通过锁机制协调多进程/线程对数据库的访问。

使用时需注意:显式事务适合多步操作,避免长时间未提交的事务阻塞写入,结合编程语言的异常处理可更安全地管理事务。

http://www.dtcms.com/a/394819.html

相关文章:

  • 广东省省考备考(第一百零四天9.22)——判断推理(强化训练)
  • k8s 常用命令
  • windows远程桌面服务安全加固的配置指南
  • datawhale玩转通义四大新模型 202509 第4次作业
  • MySQL 表约束实战指南:从概念到落地,守护数据完整性
  • 64位整型变量错误使用int类型对应的格式化符%d导致软件崩溃问题的排查与分析(借助deepseek辅助分析)
  • 【Linux操作系统】简学深悟启示录:Ext系列文件系统
  • 第8节-PostgreSQL数据类型-UUID
  • S2多维可视分析表格解析
  • 面经分享--百度开发一面
  • 第15讲 机器学习的数学
  • NestJS-身份验证JWT的使用以及登录注册
  • ChatGPT “影子泄露” 漏洞:黑客可隐秘窃取电子邮件数据
  • Coze Stdio模型配置
  • DSC 参数ARCH_HANG_FLAG对集群的影响
  • Android Jetpack Compose 从入门到精通
  • 【数据结构与算法-Day 31】图的遍历:深度优先搜索 (DFS) 详解,一条路走到黑的智慧
  • C#练习题——LinkedList 的进阶应用与测试
  • 手机CPU型号
  • jdbc相关知识
  • yolov12 导出onnx
  • Linux 环境变量与程序地址空间
  • LeetCode:48.路径总和Ⅲ
  • 计算机网络的性能
  • 深度学习笔试选择题:题组1
  • 统一配置管理根据不同域名展现不同信息或相近信息 Vue3类单例模式封装
  • 人工智能深度学习——循环神经网络(RNN)
  • 单例模式指南:全局资源的安全访问
  • 容器化 Tomcat 应用程序
  • Vue Router【前端】