Menggunakan titik penyimpanan

Unduh driver JDBC

Savepoints menawarkan mekanisme untuk mengembalikan bagian transaksi. Di dalam SQL Server, Anda dapat membuat savepoint dengan menggunakan pernyataan SAVE TRANSACTION savepoint_name. Kemudian, Anda menjalankan pernyataan ROLLBACK TRANSACTION savepoint_name untuk mengembalikan ke titik penyimpanan alih-alih menggulir kembali ke awal transaksi.

Titik penyimpanan berguna dalam situasi di mana kesalahan tidak mungkin terjadi. Penggunaan titik penyimpanan untuk menggulung balik bagian dari transaksi jika terjadi kesalahan yang jarang terjadi dapat lebih efisien daripada meminta setiap pengujian transaksi untuk melihat apakah pembaruan valid sebelum melakukan pembaruan. Pembaruan dan rollback adalah operasi yang mahal, sehingga savepoint hanya efektif jika probabilitas terjadinya kesalahan rendah dan biaya untuk memeriksa validitas pembaruan terlebih dahulu relatif tinggi.

Driver Microsoft JDBC untuk SQL Server mendukung penggunaan titik simpan melalui metode setSavepoint dari kelas SQLServerConnection . Dengan menggunakan metode setSavepoint, Anda dapat membuat titik simpan bernama atau tanpa nama dalam transaksi saat ini, dan metode akan mengembalikan objek SQLServerSavepoint . Beberapa titik penyimpanan dapat dibuat dalam transaksi. Untuk mengembalikan transaksi ke titik penyimpanan tertentu, Anda dapat meneruskan objek SQLServerSavepoint ke metode rollback (java.sql.Savepoint).

Dalam contoh berikut, savepoint digunakan saat menjalankan transaksi lokal yang terdiri atas dua statement terpisah dalam blok try. Pernyataan dijalankan terhadap tabel Production.ScrapReason dalam database sampel AdventureWorks2025, dan titik penyimpanan digunakan untuk mengembalikan pernyataan kedua. Ini mengakibatkan hanya pernyataan pertama yang dikomit ke database.

public static void executeTransaction(Connection con) {
    try(Statement stmt = con.createStatement();) {
        con.setAutoCommit(false);
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
        Savepoint save = con.setSavepoint();
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
        con.rollback(save);
        con.commit();
        System.out.println("Transaction succeeded.");
    }
    catch (SQLException ex) {
        ex.printStackTrace();
        try {
            System.out.println("Transaction failed.");
            con.rollback();
        }
        catch (SQLException se) {
            se.printStackTrace();
        }
    }
}