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

yzckvree  于 2023-05-07  发布在  SQLite
关注(0)|答案(2)|浏览(145)

我面临一个SQLite错误,尽管我没有使用任何显式的AutoCommit true或false。任何人都可以提供关于此错误的任何输入。什么情况下会出现这个错误。
先谢谢你了。Regards,Manasi保存

r55awzrz

r55awzrz1#

当我在一个循环中遍历表条目时,我反复遇到类似的问题(在我的情况下,这是一个不可能的回滚)。只要游标正在处理这些条目,SQL语句就处于“进行中”。我不知道这是否也禁止提交,但它可能是。
当您尝试处理表条目并在同一个或不同的表中插入条目时,您可能希望尝试在内存中收集数据,并在循环后执行插入或更新。
其他信息:在SQLite中,“Autocommit”通常默认为“True”(当然,它也可能取决于您使用的访问层--我使用的是Python和apsw,所以我不能在Java中告诉您更多)。这意味着,每个插入都是立即自动提交的。
==〉这可能是另一种解决方案。您可以尝试显式地打开一个事务并在循环后提交它,而不是将数据存储在内存中--这样,问题也应该消失。

pw136qt2

pw136qt22#

如果不使用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

这不起作用:

# 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()

相关问题