Lompati ke konten utama
Modul 11 · Pelajaran 4 dari 444/57 dalam kursus~12 min
Pelajaran modul (4/4)

Tingkat isolasi

Selain FOR UPDATE yang eksplisit, transaksi juga memiliki aturan matematika bawaan yang tertanam jauh di dalam mesin yang mengatur berapa banyak energi yang harus dikeluarkan untuk mengisolasi setiap interaksi individu secara default. Ini disebut Tingkat Isolasi. Di dunia SQL kita mengenal 4 standar, dalam urutan kekuatan dan keamanan tetapi jelas kebalikannya dalam hal kinerja.

  • READ UNCOMMITTED: Kegilaan anarkis, transaksi Anda akan melihat setiap perubahan yang dilakukan oleh orang lain termasuk data sementara dari orang-orang di tengah skrip mereka sendiri. Tidak ada yang menggunakannya pada DB besar, karena kesalahan Dirty Read yang terus-menerus.
  • READ COMMITTED: (Bawaan untuk Postgres). Anda akan langsung melihat data baru segera setelah pihak ketiga mengeluarkan COMMIT, namun Anda bisa menjadi korban pembacaan hantu (melihat catatan baru di tengah alur kerja panjang Anda) atau tampilan konsisten non-linier.
  • REPEATABLE READ: Lebih berat. Selama sesi jendela waktu besar Anda, saya "melihat" database dibekukan pada saat kueri saya dimulai, sama sekali mengabaikan dan bahkan mengabaikan komitmen resmi yang diselesaikan oleh orang lain! Ini melindungi terhadap rekaman yang muncul secara ajaib, menjamin stabilitas.
  • SERIALIZABLE: Tingkat dewa (Sangat lambat). Perlakukan setiap transaksi yang tumpang tindih dengan memblokirnya dan mengeksekusinya secara berurutan dalam satu jalur, dengan kejam membatalkan transaksi yang bertabrakan, bahkan menghilangkan kemungkinan ilmiah terjadinya tabrakan sekecil apa pun, mengorbankan 90% throughput tinggi.

Bagaimana cara mengaturnya?

Alih-alih BEGIN; biasa, Anda mengetik:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Atau di beberapa varian dan mesin lama Anda menetapkannya setelah memulai:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Cobalah sendiri

Latihan#sql.m11.l4.e1
Upaya: 0Memuat…

Mulai transaksi secara formal dengan menetapkan tingkat global selama masa kueri ke REPEATABLE READ untuk membuat pertukaran yang dibekukan dan dilindungi.\nIngatlah bahwa pada tingkat kueri, transaksi tersebut tidak ada gunanya kecuali diikuti oleh hal lain, jadi tutuplah transaksi tersebut dengan 'COMMIT'.

Memuat editor…
Tunjukkan petunjuk

Buka dengan BEGIN ISOLATION LEVEL REPEATABLE READ; dan ditutup dengan COMMIT;

Solusi tersedia setelah 3 upaya

Latihan#sql.m11.l4.e2
Upaya: 0Memuat…

Mari kita coba level serializable yang gila dan masukkan beberapa data fiktif.\nBuka blok 'SERIALIZABLE'.\nPerbarui nama kategori Id=2 menjadi 'Nuovo Nome Segreto'.\nJalankan atom terakhir, selesaikan komit.

Memuat editor…
Tunjukkan petunjuk

MULAI TINGKAT ISOLASI SERIALIZABLE;\nUPDATE kategori SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;

Solusi tersedia setelah 3 upaya