SQLite 事务:一组修改要一起成功或一起回滚
转账或批量导入由多条 SQL 组成,只完成前半部分会留下不一致状态。事务把这些修改放到共同的提交边界内。
问题从哪里出现
转账或批量导入由多条 SQL 组成,只完成前半部分会留下不一致状态。事务把这些修改放到共同的提交边界内。
理解核心机制
sqlite3 默认事务模式下,连接上下文在正常退出时提交、异常退出时回滚。SQL 参数使用占位符传递;连接上下文不会自动关闭连接。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
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 事务,不能一起回滚。
继续练习
把第二次插入改成不同值,确认两条记录一起提交;再在事务外增加一次写入,观察边界如何改变结果。