Persediaan Temu Duga SQL · Pelajaran

Empat Tahap Pengasingan

Daripada Read Uncommitted hingga Serializable dan perkara yang dibenarkan oleh setiap tahap.

Pelajaran 2 daripada 413 langkah

Empat Tahap Pengasingan ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Soalan di Sebalik Soalan

Apabila penemu duga bertanya "namakan empat tahap pengasingan", ujian sebenar ialah sama ada anda boleh menerangkan pertukaran itu: pengasingan yang lebih kuat bermaksud lebih sedikit anomali tetapi keserentakan yang lebih rendah.

Piawaian SQL mentakrifkan empat tahap, daripada paling lemah kepada paling kuat:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

Setiap tahap membenarkan atau melarang set anomali bacaan tertentu. Pelajaran ini merangkumi tahap-tahap tersebut; pelajaran seterusnya membincangkan anomali dengan terperinci.

Menetapkan Tahap Pengasingan

Anda menetapkan pengasingan bagi setiap transaksi atau sesi. Sintaksnya hampir sama merentas enjin.

Jika anda tidak menetapkannya, setiap pangkalan data mempunyai tetapan lalai. Mengetahui tetapan lalai ialah soalan temu duga yang sering ditanya, jadi kita akan membincangkannya pada penghujung pelajaran.

-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;

-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Tahap 1: READ UNCOMMITTED

READ UNCOMMITTED ialah tahap paling lemah. Transaksi boleh membaca baris yang telah diubah suai oleh transaksi lain tetapi belum disahkan. Bacaan ini dipanggil bacaan kotor.

Jika transaksi lain itu dibatalkan, anda telah membaca data yang sebenarnya tidak pernah wujud secara rasmi. Hal ini berbahaya untuk apa-apa perkara yang mesti tepat.

Nota: PostgreSQL menganggap READ UNCOMMITTED sama seperti READ COMMITTED, jadi ia tidak pernah benar-benar melakukan bacaan kotor. SQL Server dan MySQL mematuhinya.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;

Tahap 2: READ COMMITTED

READ COMMITTED menjamin bahawa anda hanya membaca data yang telah disahkan. Tiada bacaan kotor.

Walau bagaimanapun, setiap pernyataan melihat petikan terkini yang telah disahkan. Jika anda menjalankan pertanyaan yang sama dua kali dalam satu transaksi, transaksi lain yang disahkan di antaranya boleh mengubah hasilnya. Anomali itu ialah bacaan tidak boleh diulang.

Ini ialah tetapan lalai dalam PostgreSQL, Oracle dan SQL Server, serta merupakan imbangan yang munasabah untuk kebanyakan aplikasi.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- may now return 700
COMMIT;

Tahap 3: REPEATABLE READ

REPEATABLE READ memastikan bahawa jika anda membaca satu baris dua kali dalam transaksi yang sama, anda memperoleh nilai yang sama pada kedua-dua bacaan. Ia mengambil petikan konsisten pada permulaan transaksi.

Ia menghalang bacaan kotor dan bacaan tidak boleh diulang. Piawaian masih membenarkan bacaan hantu: baris baharu yang sepadan dengan klausa WHERE anda dan muncul apabila pertanyaan dijalankan semula.

Penting: ini ialah tetapan lalai dalam MySQL/InnoDB, dan pelaksanaan InnoDB juga menghalang kebanyakan bacaan hantu melalui penguncian kunci seterusnya.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- still 500 in this txn
COMMIT;

Tahap 4: SERIALIZABLE

SERIALIZABLE ialah tahap paling ketat. Pangkalan data menjamin bahawa hasil transaksi yang berjalan serentak adalah sama dengan hasil jika transaksi tersebut dijalankan satu demi satu mengikut susunan bersiri tertentu.

Ia menghalang bacaan kotor, bacaan tidak boleh diulang dan bacaan hantu. Kosnya ialah lebih banyak penguncian atau, dalam PostgreSQL, pembatalan akibat kegagalan penjujukan yang perlu anda cuba semula.

Ungkapan temu duga: "SERIALIZABLE memberikan gambaran bahawa setiap transaksi berjalan sendirian, dengan kos keserentakan yang berkurangan dan kemungkinan perlu mencuba semula."

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT;  -- may raise a serialization_failure you retry

Matriks Anomali

Perkara paling berguna untuk dihafal ialah anomali yang dibenarkan oleh setiap tahap. "Ya" bermaksud anomali itu boleh berlaku.

  • READ UNCOMMITTED: kotor=Ya, tidak boleh diulang=Ya, hantu=Ya
  • READ COMMITTED: kotor=Tidak, tidak boleh diulang=Ya, hantu=Ya
  • REPEATABLE READ: kotor=Tidak, tidak boleh diulang=Tidak, hantu=Ya (mengikut piawaian)
  • SERIALIZABLE: kotor=Tidak, tidak boleh diulang=Tidak, hantu=Tidak

Setiap tahap yang lebih tinggi melarang satu lagi anomali. Perkembangan itu merangkumi keseluruhan jawapan.

Piawaian berbanding Pelaksanaan Sebenar

Perbezaan pada peringkat lanjutan: piawaian SQL mentakrifkan tahap berdasarkan anomali yang mesti dihalangnya, bukan caranya. Enjin sebenar sering menghalang lebih banyak anomali.

  • PostgreSQL REPEATABLE READ menggunakan pengasingan petikan dan turut menghalang bacaan hantu, walaupun masih boleh mengalami pencongan penulisan.
  • MySQL/InnoDB REPEATABLE READ menghalang bacaan hantu melalui penguncian kunci seterusnya.
  • PostgreSQL SERIALIZABLE menggunakan SSI (Pengasingan Petikan Bersiri), lalu membatalkan transaksi apabila berlaku konflik dan bukannya menggunakan penguncian berat.

Menyebut perkara ini menunjukkan bahawa anda tahu piawaian ialah had minimum, bukan tingkah laku yang tepat.

Tahap Lalai Mengikut Enjin

Tetapan lalai sering ditanya. Hafalkan perkara ini:

  • PostgreSQL: READ COMMITTED
  • Oracle: READ COMMITTED (tiada bacaan kotor sama sekali)
  • SQL Server: READ COMMITTED
  • MySQL (InnoDB): REPEATABLE READ

Tetapan MySQL yang berbeza ialah perangkap kegemaran penemu duga. Jika ditanya "apakah tahap pengasingan lalai?", sentiasa jelaskan enjin terlebih dahulu.

Memilih Tahap dalam Amalan

Bagaimanakah anda membuat keputusan? Fikirkan perkara ini sebagai risiko berbanding daya pemprosesan.

  • Gunakan READ COMMITTED untuk OLTP biasa; ia pantas dan mengelakkan bacaan kotor.
  • Gunakan REPEATABLE READ apabila transaksi membaca data yang sama beberapa kali dan data itu mesti kekal stabil (laporan dan pengiraan berbilang langkah).
  • Gunakan SERIALIZABLE untuk logik yang kritikal kepada ketepatan, apabila sebarang anomali tidak boleh diterima, dan reka bentuk logik percubaan semula untuk pembatalan.

Hampir tidak pernah gunakan READ UNCOMMITTED dalam persekitaran pengeluaran.

Soalan Susulan yang Biasa

Selepas anda menyenaraikan tahap-tahap tersebut, penemu duga akan mengemukakan soalan susulan dengan pantas. Sediakan jawapan yang ringkas dan jelas:

  • "Tahap manakah yang menghalang bacaan kotor tetapi membenarkan bacaan tidak boleh diulang?" READ COMMITTED.
  • "Apakah satu-satunya anomali yang masih dibenarkan oleh REPEATABLE READ mengikut piawaian?" Bacaan hantu.
  • "Mengapa tidak sentiasa menggunakan SERIALIZABLE?" Ia mengurangkan keserentakan dan boleh memaksa transaksi mencuba semula apabila berlaku kegagalan penjujukan.
  • "Adakah tahap yang lebih tinggi memerlukan kos yang lebih besar?" Ya, dari segi penguncian atau beban tambahan akibat pembatalan dan percubaan semula.

Menjawab soalan-soalan ini dengan segera membuktikan bahawa hierarki itu telah difahami, bukan sekadar dihafal.

Semakan Pantas

Salah satu daripada ini ialah fakta tahap lalai yang paling kerap diuji.

Ringkasan: Empat Tahap, Satu Pertukaran

Empat tahap pengasingan membentuk hierarki daripada paling lemah kepada paling kuat: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Setiap tahap yang lebih tinggi melarang satu lagi anomali (kotor, tidak boleh diulang dan hantu) dengan kos keserentakan.

Ingat tetapan lalai (READ COMMITTED di semua tempat kecuali REPEATABLE READ dalam MySQL), dan ambil perhatian bahawa enjin sebenar sering menghalang lebih banyak anomali daripada yang diperlukan oleh piawaian. Seterusnya, kita mengkaji tiga anomali bacaan yang direka untuk dihalang oleh tahap-tahap ini.

Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Empat Tahap Pengasingan” percuma?

Ya — teks penuh “Empat Tahap Pengasingan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Empat Tahap Pengasingan”?

Daripada Read Uncommitted hingga Serializable dan perkara yang dibenarkan oleh setiap tahap. Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Empat Tahap Pengasingan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Sifat ACID Diterangkan
  2. Empat Tahap Pengasingan
  3. Bacaan Kotor, Tidak Boleh Diulang dan Hantu
  4. Kebuntuan, Penguncian dan MVCC
← Kembali ke Persediaan Temu Duga SQL