0Pricing
Java Academy · Pelajaran

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 try bagian dalam.
  • Jika berhasil, panggil commit().
  • Di dalam catch, panggil rollback() 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_READ
  • TRANSACTION_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 dan rollback() 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.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar JDBC
  2. PreparedStatement
  3. Transaksi
  4. Pengumpulan Koneksi dengan HikariCP
← Kembali ke Java Academy