Transaksi
Commit dan rollback.
Transaksi adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Apa Itu Transaksi?
Transaksi mengelompokkan beberapa operasi SQL menjadi satu unit yang seluruhnya berhasil atau seluruhnya gagal.
Setiap pernyataan berhasil dan perubahan dibuat permanen (commit), atau sesuatu gagal dan semuanya dibatalkan (rollback). Hal ini menjaga konsistensi basis data.
ACID dalam Satu Menit
Transaksi memberikan jaminan ACID:
- Atomisitas — semua atau tidak sama sekali.
- Konsistensi — memindahkan basis data dari satu keadaan valid ke keadaan valid lainnya.
- Isolasi — transaksi yang berjalan bersamaan tidak saling merusak.
- Durabilitas — setelah commit, perubahan tetap bertahan meskipun terjadi kerusakan.
Mode Commit Otomatis
Secara bawaan, koneksi JDBC berjalan dalam mode commit otomatis: setiap pernyataan merupakan transaksinya sendiri dan langsung mengalami commit.
Hal ini baik untuk satu pernyataan, tetapi tidak berguna ketika beberapa operasi penulisan harus berhasil bersama-sama. Untuk mengendalikan transaksi sendiri, nonaktifkan commit otomatis.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/bank";
try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
System.out.println("Default auto-commit: " + conn.getAutoCommit());
conn.setAutoCommit(false);
System.out.println("Now manual: " + conn.getAutoCommit());
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}Commit dan Rollback
Dengan commit otomatis dinonaktifkan, Anda menentukan batasnya:
conn.commit()menjadikan semua perubahan yang tertunda permanen.conn.rollback()membuang perubahan tersebut.
Contoh klasiknya adalah transfer uang: satu rekening didebit dan rekening lainnya dikredit. Keduanya harus terjadi, atau tidak satu pun.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/bank";
String debit = "UPDATE account SET balance = balance - ? WHERE id = ?";
String credit = "UPDATE account SET balance = balance + ? WHERE id = ?";
try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
conn.setAutoCommit(false);
try (PreparedStatement d = conn.prepareStatement(debit);
PreparedStatement c = conn.prepareStatement(credit)) {
d.setInt(1, 100); d.setInt(2, 1); d.executeUpdate();
c.setInt(1, 100); c.setInt(2, 2); c.executeUpdate();
conn.commit();
System.out.println("Transfer committed");
} catch (SQLException ex) {
conn.rollback();
System.out.println("Rolled back: " + ex.getMessage());
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}Pola Rollback saat Kegagalan
Struktur yang perlu diingat:
- Nonaktifkan commit otomatis.
- Lakukan pekerjaan di dalam
trybagian dalam. - Jika berhasil, panggil
commit(). - Di dalam
catch, panggilrollback()lalu teruskan kembali pengecualian atau catat kesalahannya.
Tanpa rollback, kegagalan dapat membuat basis data hanya diperbarui sebagian.
Mensimulasikan Atomisitas
Berikut gagasan semua atau tidak sama sekali yang dimodelkan dalam Java sederhana agar dapat dijalankan secara mandiri. Kami menerapkan dua pembaruan pada salinan keadaan; jika salah satunya gagal, kami memulihkan salinan keadaan tersebut.
public class Main {
public static void main(String[] args) {
int[] balances = {500, 300};
int[] backup = balances.clone();
try {
balances[0] -= 200;
if (balances[0] < 0) throw new IllegalStateException("insufficient funds");
balances[1] += 200;
System.out.println("Commit: " + balances[0] + ", " + balances[1]);
} catch (RuntimeException e) {
balances = backup;
System.out.println("Rollback: " + balances[0] + ", " + balances[1]);
}
}
}Titik Pemulihan
Titik pemulihan adalah penanda di dalam transaksi. Anda dapat melakukan rollback ke titik tersebut tanpa membuang seluruh transaksi.
Savepoint sp = conn.setSavepoint()conn.rollback(sp)hanya membatalkan pekerjaan setelah titik tersebut.
Berguna untuk pemulihan sebagian dalam transaksi panjang.
Tingkat Isolasi
Isolasi mengendalikan apa yang dapat dilihat satu transaksi dari pekerjaan transaksi lain yang belum mengalami commit. JDBC menentukan tingkat-tingkat ini melalui conn.setTransactionIsolation(...):
TRANSACTION_READ_COMMITTED— bawaan yang umum.TRANSACTION_REPEATABLE_READTRANSACTION_SERIALIZABLE— paling kuat, paling lambat.
Isolasi yang lebih tinggi mencegah anomali, tetapi mengurangi konkurensi.
Anomali Pembacaan
Isolasi yang lebih rendah dapat memungkinkan:
- Pembacaan kotor — melihat perubahan transaksi lain yang belum mengalami commit.
- Pembacaan tidak berulang — satu baris berubah di antara dua pembacaan.
- Pembacaan hantu — baris baru muncul dan cocok dengan kueri sebelumnya.
Pilih tingkat terendah yang tetap mencegah anomali yang tidak dapat ditoleransi oleh logika Anda.
Memulihkan Commit Otomatis
Jika Anda meminjam koneksi dari kumpulan koneksi, pulihkan keadaan aslinya sebelum mengembalikannya.
Setelah transaksi manual, panggil conn.setAutoCommit(true) lagi (atau kembalikan ke nilai yang Anda lihat saat meminjamnya) agar pengguna berikutnya tidak dikejutkan oleh pengaturan Anda.
Jaga Transaksi Tetap Singkat
Transaksi menahan kunci hingga mengalami commit atau rollback. Transaksi yang panjang menghambat pekerjaan lain dan meningkatkan risiko kebuntuan.
- Jangan melakukan panggilan jaringan yang lambat atau menunggu masukan pengguna di dalam transaksi yang terbuka.
- Kumpulkan data terlebih dahulu, lalu buka koneksi, tulis, dan lakukan commit dengan cepat.
Transaksi yang singkat dan terfokus jauh lebih mudah diskalakan.
Pemeriksaan Singkat
Apa efek dari memanggil connection.rollback()?
Ringkasan
Transaksi memberi Anda keamanan semua atau tidak sama sekali:
- Nonaktifkan commit otomatis dengan
setAutoCommit(false). - Panggil
commit()saat berhasil danrollback()saat gagal. - Gunakan titik pemulihan untuk rollback sebagian.
- Sesuaikan tingkat isolasi untuk menyeimbangkan ketepatan dan konkurensi.
- Pulihkan commit otomatis sebelum mengembalikan koneksi dari kumpulan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Transaksi” gratis?
Ya — teks lengkap “Transaksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Transaksi”?
Commit dan rollback. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Transaksi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.