SQLite错误:无法提交事务 - 使用Java代码正在进行的SQL语句

MyS*_*DBA 7 sqlite progress autocommit

虽然我没有使用任何显式的AutoCommit true或false,但我面临SQLite错误.任何人都可以提供此错误的任何输入.你会遇到这个错误的情况是什么.

提前致谢.此致,Manasi Save

umi*_*itu 6

RETURNING当不使用子句返回的值时,可能会发生该错误。我可以提供复制代码,尽管它是用 Python 编写的。

这有效:

# Connect to an in-memory database
import sqlite3
conn = sqlite3.connect(":memory:")

# Create a table
conn.execute("CREATE TABLE t(c)")
conn.commit()

# INSERT ... RETURNING with fetchall()
cursor = conn.execute("INSERT INTO t VALUES (1) RETURNING rowid")

cursor.fetchall()  # returns [(1,)]
conn.commit()  # no error
Run Code Online (Sandbox Code Playgroud)

这不起作用:

# Connect to an in-memory database
import sqlite3
conn = sqlite3.connect(":memory:")

# Create a table
conn.execute("CREATE TABLE t(c)")
conn.commit()

# INSERT ... RETURNING without fetchall()
cursor = conn.execute("INSERT INTO t VALUES (1) RETURNING rowid")

# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# sqlite3.OperationalError: cannot commit transaction - SQL statements in progress
conn.commit()
Run Code Online (Sandbox Code Playgroud)


Jue*_*gen 5

当我在一个循环遍历表条目的循环中时,我反复遇到类似的问题(在我的情况下,这是一个不可能的回滚).只要游标正在处理条目,SQL语句就"正在进行中".我不确切地知道,如果这也禁止提交,但它可能是.

当您尝试处理表条目并在相同或不同的表中插入条目时,您可能希望尝试在内存中收集数据,并在循环之后执行插入或更新.

附加信息:"Autocommit"通常在SQLite中默认为"True"(当然它也可能取决于您使用的访问层 - 我使用的是Python和apsw,因此我无法在Java中告诉您更多相关信息).这意味着,每个插入物都是立即自动更新的.

==>这可能是另一种解决方案.您可以尝试显式打开事务并在循环之后提交它,而不是将数据存储在内存中 - 这样,问题也应该消失.