JDBC事务和ResultSet(s)和SELECT语句

时间:2013-12-23 17:11:54

标签: java select jdbc transactions resultset

因为我最近能够在 JDBC&交易通常只涵盖非常简单的案例:

  1. 开始交易
  2. 发出几个UPDATE / INSERT 语句
  3. 提交交易
  4. 回滚如果在交易期间发生任何错误
  5. 我想知道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
    }
    

    所以问题是:

    1. 上述模板至少仅对 UPDATE / INSERT语句是正确的吗?
    2. 如果在事务期间发生任何 SELECT 语句错误以在提交之前读取它的 ResultSet ,是否正确?
    3. connection.commit()之前,事务隔离级别与读取 ResultSets 的可能性之间是否存在关联? [这个问题延伸到第二个]
    4. 执行 INSERT语句后,同样的规则是否适用于从PreparedStatement.getGeneratedKeys()返回的 ResultSet
    5. 注意:我想找到最通用的方法,但如果它是特定于供应商的,我正在使用 MySQL 数据库。当然,我对这个话题的任何帮助感兴趣并感激不尽!

0 个答案:

没有答案