SQL7008 错误 - 解决方法?
Posted
技术标签:
【中文标题】SQL7008 错误 - 解决方法?【英文标题】:SQL7008 Error - Workaround? 【发布时间】:2012-01-04 04:18:44 【问题描述】:我正在将 JTOpen JDBC 驱动程序用于 DB2 通用数据库。除了简单的语句之外,我对 SQL 的经验很少。
从this question,我看到在尝试“在事务期间插入/更新非日志表中的行”时抛出了我得到的错误 (SQL7008)(释义)。
根据项目负责人的说法,我们的 DB 没有日志记录,也不会很快出现(不要问我为什么,我不是 DBA)。但是,我正在开发一个项目,其中几乎有必要能够一次完成commit
的所有操作(而不是每次调用执行时都自动提交)(并非完全需要,但它可以解决很多问题路)。
有没有办法在不启用 Journalling 的情况下解决错误 SQL7008?
【问题讨论】:
【参考方案1】:我发现在 DB2 语句末尾使用WITH NONE
可以解决问题,只有使用 INSERT。
当我尝试在 Delete 语句上使用 SET OPTION COMMIT=*NONE
时,它似乎会跳过 where,它会删除所有内容,当我尝试使用 WITH NC
或 WITH NONE
时也会发生同样的情况
要解决此问题,请执行以下操作之一:
为数据库表启用日志记录: Windows:在其中添加值为“32”的 CLI 参数“TxnIsolation” “管理工具”下的 ODBC 设置。这个选项可以 位于:“数据源”->“高级设置”->“添加”-> “TxnIsolation”作为单选按钮“No Commit”。
AIX / Unix:在您的数据库上运行以下 DB2 命令:' db2 使用 TXNIsolation 32' 更新部分的 cli cfg。核实 使用以下命令进行这些设置:'db2 get cli cfg'
备用 SQL 解决方法:(不特定于操作系统):在末尾添加“WITH NONE” 您的 SQL UPDATE 命令。
More info...
【讨论】:
请引用链接中最相关的部分,以防目标站点无法访问或永久离线。见How do I write a good answer。【参考方案2】:如果使用 CL 命令。以下命令解决了这个问题:
RUNSQLSTM SRCFILE(LIBNAME/SRCFILE) SRCMBR(MBRFILE) COMMIT(*NONE) NAMING(*SQL)
【讨论】:
这是为调用停在源机器中的脚本的人准备的。【参考方案3】:在不启用日志的情况下解决此问题的唯一方法是在连接字符串中禁用 事务隔离,如下所示:
jdbc:as400://systemname;naming=sql;errors=full;transaction isolation=none;date format=iso
可以在IBM Toolbox for Java JDBC properties 文档中找到 JDBC 属性的完整列表。
【讨论】:
您是否知道 JTOpen 库中的AS400JDBCConnectionPoolDataSource
是否支持这种 URL 格式?
@BenCole AS400JDBCConnection class:创建连接时可以指定许多可选属性。可以将属性指定为 URL 的一部分,也可以在 java.util.Properties 对象中指定。有关 AS400JDBCDriver 支持的属性的完整列表,请参阅 IBM Toolbox for Java JDBC 属性。
就是这样!嗯,有点。我必须在 DataSource 对象中设置 TransactionIsolation("none")。
我看到它是一个旧的,但我真的很想弄清楚我的理解。通过将 none 设置为事务隔离,它将在数据库级别具有任何默认值。因为我很久以前就遇到过死锁场景。隔离级别当然有帮助。所以让我知道这个建议有多可靠和积极!然而,詹姆斯提到这是一种解决方法。【参考方案4】:
有一个选项可以添加到您的连接字符串disables commitment control。
CommitMode=0
可能会起作用。
【讨论】:
CommitMode 选项用于 ODBC 连接字符串。 JDBC 属性不一样。 不幸的是,相关的 Java 功能(据我所知)似乎是Connection.setTransactionIsolation(int level)
。不幸的是,CommitMode=0
的相关值是Connection.TRANSACTION_NONE
,它被保留在注释中:Note that Connection.TRANSACTION_NONE cannot be used because it specifies that transactions are not supported.)
对不起,我以为连接字符串是一样的。【参考方案5】:
SQL7008 的官方列表是here(对 SQL7008 执行 CTRL-F)。看起来您可以从原因码中获取更多信息。如果您收到原因码 3,除了启用日记功能之外似乎没有其他选择。
如果您得到的不是原因码 3,那么我想您还有更多选择。
希望对您有所帮助。
【讨论】:
在哪里可以找到引发 SQLException 的原因码?我得到 SQLState = 55019 和错误代码 = -7008。 如果你在 java 中查看 SQLException,它的任何其他字段中是否有任何内容,例如供应商代码? 不幸的是,这似乎是我得到的唯一信息。以上是关于SQL7008 错误 - 解决方法?的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER 9003错误解决方法 只适用于SQL2000