如何在SQLite中根据条件回滚或提交事务?
SQLite事务的条件提交/回滚实现方法
首先明确:SQLite的纯SQL语法里,COMMIT和ROLLBACK是独立的执行命令,不能像你写的那样作为IIF这类表达式的参数来执行——你的代码里iif(..., commit, rollback)会被SQLite判定为无效语法,因为它会把commit和rollback当成普通标识符,而非要执行的命令。
下面给你两种可行的实现方式:
一、通过客户端代码控制(推荐,最常用)
不管你用Python、Java、C#还是其他语言,都可以在代码里先执行更新操作,再查询验证结果,最后根据结果决定提交或回滚。
以Python为例,代码逻辑如下:
import sqlite3 # 连接数据库 conn = sqlite3.connect("你的数据库文件名.db") cur = conn.cursor() try: # 开启延迟外键检查 cur.execute("PRAGMA defer_foreign_keys = true;") # 启动事务 cur.execute("BEGIN TRANSACTION;") # 执行你的更新操作 cur.execute("UPDATE language SET id=3 - id WHERE id < 3;") # 执行检查逻辑,获取验证结果 cur.execute(""" SELECT EXISTS(SELECT 1 FROM language WHERE id = '1' AND code = 'PL') AND EXISTS(SELECT 1 FROM language WHERE id = '2' AND code = 'EN'); """) is_valid = cur.fetchone()[0] # 根据结果提交或回滚 if is_valid: conn.commit() print("事务提交成功") else: conn.rollback() print("事务已回滚") finally: # 恢复外键检查设置 cur.execute("PRAGMA defer_foreign_keys = false;") # 关闭连接 conn.close()
二、用命令行脚本结合SQL执行(适合纯SQL脚本场景)
如果是在shell环境下用sqlite3命令行工具执行,可以分步骤先执行更新,再查询结果,最后根据结果执行提交或回滚:
# 第一步:开启事务并执行更新 sqlite3 你的数据库文件名.db <<EOF PRAGMA defer_foreign_keys = true; BEGIN TRANSACTION; UPDATE language SET id=3 - id WHERE id < 3; EOF # 第二步:查询验证结果 VALID=$(sqlite3 你的数据库文件名.db "SELECT EXISTS(SELECT 1 FROM language WHERE id = '1' AND code = 'PL') AND EXISTS(SELECT 1 FROM language WHERE id = '2' AND code = 'EN');") # 第三步:根据结果提交或回滚 if [ "$VALID" -eq 1 ]; then sqlite3 你的数据库文件名.db "COMMIT;" else sqlite3 你的数据库文件名.db "ROLLBACK;" fi # 第四步:恢复外键设置 sqlite3 你的数据库文件名.db "PRAGMA defer_foreign_keys = false;"
核心逻辑就是:先执行更新,再单独查询验证条件,最后根据查询结果独立执行COMMIT或ROLLBACK命令,因为SQLite不支持在表达式里嵌套执行事务控制命令。
内容的提问来源于stack exchange,提问作者greenoldman
相关产品推荐
相关产品推荐

