Menggunakan titik simpan
Savepoints menawarkan mekanisme untuk mengembalikan bagian transaksi. Dalam SQL Server, Anda dapat membuat titik penyimpanan dengan menggunakan pernyataan SAVEPOINT_NAME SIMPAN TRANSAKSI. 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 pembatalan adalah operasi yang mahal, sehingga titik penyimpanan hanya efektif jika probabilitas mengalami kesalahan rendah dan biaya memeriksa validitas pembaruan sebelumnya 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, titik penyimpanan digunakan saat melakukan transaksi lokal yang terdiri dari dua pernyataan terpisah di try
blok. Pernyataan dijalankan terhadap tabel Production.ScrapReason dalam database sampel AdventureWorks2022, dan titik penyimpanan digunakan untuk mengembalikan pernyataan kedua. Ini hanya menghasilkan pernyataan pertama yang diterapkan 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();
}
}
}