Bagikan melalui


Menggunakan holdability

Unduh driver JDBC

Secara default, kumpulan hasil yang dibuat dalam transaksi tetap terbuka setelah transaksi dilakukan ke database, atau ketika digulung balik. Namun, terkadang berguna agar tataan hasil ditutup, setelah transaksi dilakukan. Untuk melakukan ini, Driver Microsoft JDBC untuk SQL Server mendukung penggunaan holdabilitas tataan hasil.

Holdabilitas tataan hasil dapat diatur dengan menggunakan metode setHoldability kelas SQLServerConnection . Saat mengatur holdability dengan menggunakan metode setHoldability, konstanta holdability tataan hasil dari ResultSet.HOLD_CURSORS_OVER_COMMIT atau ResultSet.CLOSE_CURSORS_AT_COMMIT dapat digunakan.

Driver JDBC juga mendukung pengaturan holdability saat membuat salah satu objek Pernyataan. Saat membuat objek Pernyataan yang memiliki kelebihan beban dengan parameter holdability tataan hasil, holdability objek pernyataan harus sesuai dengan holdability koneksi. Ketika mereka tidak cocok, pengecualian akan dilemparkan. Ini karena SQL Server hanya mendukung holdability di tingkat koneksi.

Ketahanan kumpulan hasil adalah daya tahan objek SQLServerConnection yang terkait dengan tataan hasil pada saat tataan hasil dibuat hanya untuk kursor sisi server. Ini tidak berlaku untuk kursor sisi klien. Semua tataan hasil dengan kursor sisi klien akan selalu memiliki nilai penahanan .ResultSet.HOLD_CURSORS_OVER_COMMIT

Untuk kursor server, saat tersambung ke SQL Server 2005 atau yang lebih baru, mengatur holdabilitas hanya memengaruhi daya tahan kumpulan hasil baru yang belum dibuat pada koneksi tersebut. Ini berarti bahwa pengaturan holdabilitas tidak berdampak pada penangguhan set hasil apa pun yang sebelumnya dibuat dan sudah terbuka pada koneksi tersebut.

Dalam contoh berikut, holdabilitas tataan hasil diatur saat melakukan transaksi lokal yang terdiri dari dua pernyataan terpisah dalam try blok. Pernyataan dijalankan terhadap tabel Production.ScrapReason dalam database sampel AdventureWorks2022. Pertama, contoh beralih ke mode transaksi manual dengan mengatur penerapan otomatis ke false. Setelah mode penerapan otomatis dinonaktifkan, tidak ada Pernyataan SQL yang akan diterapkan sampai aplikasi memanggil metode penerapan secara eksplisit. Kode dalam blok tangkapan mengembalikan transaksi jika pengecualian dilemparkan.

public static void executeTransaction(Connection con) {
    try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
        con.setAutoCommit(false);
        con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);

        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Bad part')");
        ResultSet rs = stmt.executeQuery("SELECT * FROM Production.ScrapReason");
        con.commit();
        System.out.println("Transaction succeeded.");

        // Display results.
        while (rs.next()) {
            System.out.println(rs.getString(2));
        }
    }
    catch (SQLException ex) {
        ex.printStackTrace();
        try {
            System.out.println("Transaction failed.");
            con.rollback();
        }
        catch (SQLException se) {
            se.printStackTrace();
        }
    }
}

Lihat juga

Melakukan transaksi dengan driver JDBC