Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC事务和结果集以及SELECT语句_Java_Select_Jdbc_Transactions_Resultset - Fatal编程技术网

Java JDBC事务和结果集以及SELECT语句

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

因为我最近在JDBC&transactions上找到的大多数教程通常只涉及非常简单的情况,如:

  • 开始交易
  • 发布几条更新/插入语句
  • 提交事务
  • 在事务处理过程中发生任何错误时回滚
  • 我想知道JDBC事务的正确模板是什么样子的,特别是在涉及SELECT语句的情况下

    据我所知,通用模板类似于:

    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
    }
    
    因此,问题是:

  • 上述模板是否至少仅对更新/插入语句正确
  • 如果在事务期间出现任何SELECT语句,那么在提交之前读取它的ResultSet错误的,这是否正确
  • 事务隔离级别与调用connection.commit()之前读取结果集的可能性之间是否存在相关性?[这是第二个问题]
  • 执行INSERT语句后返回的结果集是否适用相同的规则

  • 注意:我想找到最通用的方法,但如果它是特定于供应商的,我使用的是MySQL数据库。当然,我对这个话题的任何帮助都感兴趣并表示感谢

    为什么要在提交后读取结果集?如果在事务期间不读取任何内容,那么设置隔离级别有什么意义?隔离级别精确地定义了事务可以读取的内容。不管怎样,您经常需要根据您从数据库中读取的内容插入和更新值。@JBNizet
    为什么在提交后要读取结果集?
    -不知怎的,我开始认为
    commit()
    方法也适用于
    ps.executeQuery()
    method,如果我在
    commit()
    method:)之前阅读它,那么
    ResultSet
    将是空的,但是,您的短语
    隔离级别精确地定义了事务可以读取的内容。
    澄清(并简化)了很多!我没有太多的交易经验,虽然读了一些理论,但看起来我错过了一些东西。如果你把你的评论作为回答,我很乐意接受!大多数驱动程序默认为
    ResultSet。在提交时关闭游标,这应该是一个很大的提示。正如您所知,
    setAutoCommit
    在大多数驱动程序中实际上并不启动事务,它只是禁用自动提交,JDBC驱动程序会在需要时隐式启动事务(例如语句prepare或execute)@markrottevel
    AFAIK大多数驱动程序默认为ResultSet.CLOSE\u CURSORS\u AT\u COMMIT这应该是一个很大的提示
    -是的,这是一个很好的提示(不知道为什么我开始认为
    ResultSet
    应该在
    COMMIT
    之后读取:))谢谢你关于
    setAutoCommit
    的评论-我不知道。@jbnize你介意我用你评论中的信息自己发布这个问题的答案吗?