Java JDBCInformix事务回滚
在一个maven项目中,我连接到一个informix数据库,我想在异常发生时进行回滚。 informix似乎不支持回滚,我收到了以下异常Java JDBCInformix事务回滚,java,maven,jdbc,informix,Java,Maven,Jdbc,Informix,在一个maven项目中,我连接到一个informix数据库,我想在异常发生时进行回滚。 informix似乎不支持回滚,我收到了以下异常 java.sql.SQLException: Not in transaction. at com.informix.util.IfxErrMsg.buildExceptionWithMessage(IfxErrMsg.java:416) at com.informix.util.IfxErrMsg.buildIsamException(Ifx
java.sql.SQLException: Not in transaction.
at com.informix.util.IfxErrMsg.buildExceptionWithMessage(IfxErrMsg.java:416)
at com.informix.util.IfxErrMsg.buildIsamException(IfxErrMsg.java:401)
at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3096)
at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3368)
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2292)
at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2217)
at com.informix.jdbc.IfxSqli.executeRollback(IfxSqli.java:646)
at com.informix.jdbc.IfxSqliConnect.rollback(IfxSqliConnect.java:2124)
at com.company.helpers.DBDriver.makeConnection(DBDriver.java:72)
at com.company.Main.main(Main.java:40)
下面是有问题的片段。调用connection.rollback()
时发生异常。出于测试目的,我在try
子句上调用了rollback
try{
connection = DriverManager.getConnection(this.url,this.username,this.password);
LOGGER.info("Database connection successful.");
statement = connection.createStatement();
resultSet = statement.executeQuery("select FIRST 10 * from clients");
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + ", " + resultSet.getString("name"));
}
String sql = "UPDATE clients\n" +
"\tSET idhost=5\n" +
"\tWHERE id=9058;\n";
statement.executeUpdate(sql);
connection.rollback(); //temporary to test rollback()
//connection.commit();
}
catch (Exception e) {
//connection.rollback();
LOGGER.error("Errors occurred in database.");
LOGGER.error(e.getMessage(), e);
}
Informix有4种类型的数据库:
- 未锁定
- 缓冲记录
- 无缓冲测井
- (无缓冲记录和)模式ANSI
Statement st = connection.createStatement;
int count = st.executeUpdate("BEGIN WORK");
st.close();
或者可以使用“立即执行”选项。代码未经测试;我不是JDBC程序员,也没有测试JDBC代码的设置。
分析基本正确。建议的解决方案并非如此。有关提供解决问题的正确方法的
autocommit
的讨论,请参见by。Informix有4种类型的数据库:
- 未锁定
- 缓冲记录
- 无缓冲测井
- (无缓冲记录和)模式ANSI
Statement st = connection.createStatement;
int count = st.executeUpdate("BEGIN WORK");
st.close();
或者可以使用“立即执行”选项。代码未经测试;我不是JDBC程序员,也没有测试JDBC代码的设置。
分析基本正确。建议的解决方案并非如此。有关
自动提交
的讨论,请参见by,它提供了解决问题的正确方法。这实际上是使用JDBC自动提交时的预期行为。Informix JDBC驱动程序默认启用了自动提交。看见
请简单介绍一下
因此,您执行的每个语句都会自动提交。JDBC基本上为每个查询和/或语句执行BEGIN-WORK、EXECUTE、COMMIT-WORK
因此,当您显式执行连接.rollback()
时,它将失败,因为您的所有语句都已提交,从技术上讲,您不在事务中
您可以使用connection.setAutoCommit(false)
关闭此功能,然后可以发出SQL语句“开始工作”
来启动事务,并发出connection.rollback()
来回滚它
正如Jonathan所指出的,另一个怪癖是使用ANSI兼容的数据库而不是普通的日志数据库。如果是ANSI,则不需要“开始工作
”,因为ANSI数据库始终位于事务中,并且会为您启动一个新数据库
通常,如果要处理事务,必须关闭自动提交。这实际上是使用JDBC自动提交时的预期行为。Informix JDBC驱动程序默认启用了自动提交。看见 请简单介绍一下 因此,您执行的每个语句都会自动提交。JDBC基本上为每个查询和/或语句执行BEGIN-WORK、EXECUTE、COMMIT-WORK 因此,当您显式执行
连接.rollback()
时,它将失败,因为您的所有语句都已提交,从技术上讲,您不在事务中
您可以使用connection.setAutoCommit(false)
关闭此功能,然后可以发出SQL语句“开始工作”
来启动事务,并发出connection.rollback()
来回滚它
正如Jonathan所指出的,另一个怪癖是使用ANSI兼容的数据库而不是普通的日志数据库。如果它是ANSI,那么您将