Java JDBC事务和结果集以及SELECT语句
因为我最近在JDBC&transactions上找到的大多数教程通常只涉及非常简单的情况,如:Java JDBC事务和结果集以及SELECT语句,java,select,jdbc,transactions,resultset,Java,Select,Jdbc,Transactions,Resultset,因为我最近在JDBC&transactions上找到的大多数教程通常只涉及非常简单的情况,如: 开始交易 发布几条更新/插入语句 提交事务 在事务处理过程中发生任何错误时回滚 我想知道JDBC事务的正确模板是什么样子的,特别是在涉及SELECT语句的情况下 据我所知,通用模板类似于: final int previousIsolationLevel = connection.getTransactionIsolation(); try { connection.setTransactio
final int previousIsolationLevel = connection.getTransactionIsolation();
try {
connection.setTransactionIsolation(desiredIsolationLevel);
connection.setAutoCommit(false); // starting transaction
// executing UPDATE / INSERT statements here using ps.executeUpdate(...)
// executing SELECT statements and storing references to result sets like:
// ResultSet rs1 = ps1.executeQuery(...);
// ResultSet rs2 = ps2.executeQuery(...);
// ...
// ResultSet rsN = psN.executeQuery(...);
connection.commit(); // committing transaction
// reading data from rs1, ... , rsN AFTER commit like
// while(rs1.next()) { ... }, while(rs2.next()) { ... }, ...
} catch (final Throwable ex) {
connection.rollback(); // rolling back the transaction upon any exception
// doing exception-handling stuff
} finally {
connection.setAutoCommit(true); // setting auto-commit mode back to true
connection.setTransactionIsolation(previousIsolationLevel); // setting transaction isolation to previous value
}
因此,问题是:
注意:我想找到最通用的方法,但如果它是特定于供应商的,我使用的是MySQL数据库。当然,我对这个话题的任何帮助都感兴趣并表示感谢 为什么要在提交后读取结果集?如果在事务期间不读取任何内容,那么设置隔离级别有什么意义?隔离级别精确地定义了事务可以读取的内容。不管怎样,您经常需要根据您从数据库中读取的内容插入和更新值。@JBNizet
为什么在提交后要读取结果集?
-不知怎的,我开始认为commit()
方法也适用于ps.executeQuery()
method,如果我在commit()
method:)之前阅读它,那么ResultSet
将是空的,但是,您的短语隔离级别精确地定义了事务可以读取的内容。
澄清(并简化)了很多!我没有太多的交易经验,虽然读了一些理论,但看起来我错过了一些东西。如果你把你的评论作为回答,我很乐意接受!大多数驱动程序默认为ResultSet。在提交时关闭游标,这应该是一个很大的提示。正如您所知,setAutoCommit
在大多数驱动程序中实际上并不启动事务,它只是禁用自动提交,JDBC驱动程序会在需要时隐式启动事务(例如语句prepare或execute)@markrottevelAFAIK大多数驱动程序默认为ResultSet.CLOSE\u CURSORS\u AT\u COMMIT这应该是一个很大的提示
-是的,这是一个很好的提示(不知道为什么我开始认为ResultSet
应该在COMMIT
之后读取:))谢谢你关于setAutoCommit
的评论-我不知道。@jbnize你介意我用你评论中的信息自己发布这个问题的答案吗?