我正在开发一种基于 Java 的实用程序,它将某些列值从一个表迁移到另一个表。我的第一个表包含一个 ID 列,其值是固定类型的(例如,之前在第一个表中插入的 Java 中的某些枚举类型)
以下是我正在遵循的总结步骤:
该实用程序支持 Oracle、UDB 和 ZOS 数据库,并且在 Oracle 和 UDB 上运行良好。但是,对于 ZOS 数据库,在关闭数据库连接时,我遇到以下异常:
com.ibm.db2.jcc.a.SqlException: [jcc][t4][10251][10308][3.52.90] java.sql.Connection.close() requested while a transaction is in progress on the connection.
The transaction remains active, and the connection cannot be closed.
ERRORCODE=-4471, SQLSTATE=null
在这里,在我的主线程中,我首先删除表,然后关闭连接,从而以顺序方式执行这些操作。那为什么我会收到上述异常呢?我做错了什么?
当我将自动提交设置为 false 时,是否需要对 DROP 进行显式提交?
在Db2中,在关闭数据库连接之前需要使用COMMIT或ROLLBACK提交事务。仅当您对数据库数据进行更改(例如INSERT和DELETE)时,才会执行COMMIT和ROLLBACK,并且COMMIT和ROLLBACK用于仅引用数据的SELECT。我确信有很多人不注意-,但至少在 Db2 中,即使在 SELECT` 的情况下,你也需要了解事务。
在上面的源代码中,自动提交被关闭(con.setAutoCommit(false))。如果auto-commit = true,jdbc驱动程序会在调用Connection::close时自动提交,但如果auto-commit = false,程序员会显式地Connection::commit或。如果不调用Connection::rollback,事务将不会被提交。换句话说,在上面的源代码中,我们关闭了自动提交,因此我们尝试在未确认事务的情况下关闭连接,导致“ERRORCODE = -4471”。