WMX · 随记
·Python· 3 分钟阅读

SQLite 事务:一组修改要一起成功或一起回滚

转账或批量导入由多条 SQL 组成,只完成前半部分会留下不一致状态。事务把这些修改放到共同的提交边界内。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

转账或批量导入由多条 SQL 组成,只完成前半部分会留下不一致状态。事务把这些修改放到共同的提交边界内。

理解核心机制

sqlite3 默认事务模式下,连接上下文在正常退出时提交、异常退出时回滚。SQL 参数使用占位符传递;连接上下文不会自动关闭连接。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python14 行 · 可横向滚动
import sqlite3
connection = sqlite3.connect(":memory:")
try:
    connection.execute("CREATE TABLE item (name TEXT UNIQUE)")
    try:
        with connection:
            connection.execute("INSERT INTO item VALUES (?)", ("a",))
            connection.execute("INSERT INTO item VALUES (?)", ("a",))
    except sqlite3.IntegrityError:
        pass
    assert connection.execute("SELECT COUNT(*) FROM item").fetchone()[0] == 0
    print("both writes rolled back")
finally:
    connection.close()

适用边界与常见误区

Python 版本和连接 autocommit 配置会影响事务控制,升级时应对照文档确认。网络调用等外部副作用不属于 SQLite 事务,不能一起回滚。

继续练习

把第二次插入改成不同值,确认两条记录一起提交;再在事务外增加一次写入,观察边界如何改变结果。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档