3

setAutoCommitfalse であり、接続を閉じる前に例外がスローされますが、それでもトランザクションはコミットされます。これは奇妙な動作ではありませんか?

public static void insertEmployee(){

        String query1 = "INSERT INTO EMPLOYEE VALUES(80, 'from code')";
        String query2 = "INSERT INTO EMPLOYEE VALUES(81, 'from code')";
        Connection connection = null;
        Statement statement = null;
        try {
            connection =   DriverManager.getConnection(url, username, password);
            connection.setAutoCommit(false);
            statement = connection.createStatement();
            statement.executeUpdate(query1);
            ResultSet resultSet = statement.executeQuery(query2);
            while(resultSet.next()) //this code throws the exception kept like this intentionally
            {
                int empNo = resultSet.getInt("EMPLOYEE_ID");
                String eName = resultSet.getString("EMPLOYEE_NAME");
                System.out.println("eName = " + eName);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
4

1 に答える 1

4

auto-commit を に設定falseすると、ステートメントの変更が実行直後にコミットされないことを意味します。ただし、[必ずしも] の動作には影響しませんclose()。コミットされていないデータをコミットするかロールバックするかを選択できます。ドキュメントに記載されているように:

close メソッドを呼び出す前に、アクティブなトランザクションをアプリケーションで明示的にコミットまたはロールバックすることを強くお勧めします。close メソッドが呼び出され、アクティブなトランザクションがある場合、結果は実装定義です。

つまり、自動コミット フラグに関係なく、オブジェクトをing する前に、常に明示的にまたはオブジェクトをcommit()指定する必要があります。rollback()Connectionclose()

try {
    // DML operations here

    // Explicitly commit if we got this far
    connection.commit();
} catch (SQLException e) {
    // If an exception occurred, explicitly rollback:
    connection.rollback();

    // Log somehow
    e.printStackTrace();
 } finally {
    // Close resources 
 }
于 2015-09-23T09:51:25.487 に答える