Bacaan Kotor, Tidak Boleh Diulang dan Hantu
Tiga anomali bacaan serta tahap pengasingan yang menghalang setiap satunya.
Bacaan Kotor, Tidak Boleh Diulang dan Hantu ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 3 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.
Tiga Anomali Bacaan
Tahap pengasingan wujud untuk mencegah pepijat keserentakan tertentu yang dipanggil anomali bacaan. Penemuduga menjangkakan anda dapat mentakrifkan ketiga-tiganya dengan tepat dan memadankan setiap satu dengan tahap yang menghalangnya.
- Bacaan kotor - membaca data yang belum di-COMMIT
- Bacaan tidak boleh diulang - baris berubah antara dua bacaan
- Bacaan hantu - baris baharu muncul antara dua bacaan
Cabarannya ialah membezakan bacaan tidak boleh diulang daripada bacaan hantu, kerana kedua-duanya melibatkan pelaksanaan semula pertanyaan dan memperoleh hasil yang berbeza.
Bacaan Kotor: Takrif
Bacaan kotor berlaku apabila transaksi T1 membaca baris yang telah diubah suai oleh transaksi T2 tetapi belum di-COMMIT. Jika T2 kemudian melakukan ROLLBACK, T1 telah bertindak berdasarkan data yang sebenarnya tidak pernah wujud.
Hanya READ UNCOMMITTED membenarkan bacaan kotor. Semua tahap yang lebih tinggi melarangnya.
Bahaya dunia sebenar: meluluskan pinjaman berdasarkan deposit yang kemudiannya dibatalkan dengan ROLLBACK beberapa saat kemudian.
Bacaan Kotor: Garis Masa
Baca dua lajur sebagai garis masa. T1 sedang berjalan pada READ UNCOMMITTED.
T1 melihat baki 700, tetapi T2 tidak pernah melakukan COMMIT. Nilai 700 itu ialah nilai hantu yang terhasil daripada kerja T2 yang belum selesai. Selepas T2 melakukan ROLLBACK, nilai sebenar masih 500. T1 membuat keputusan berdasarkan data yang tidak sah.
-- T2 (not committed) | -- T1 (READ UNCOMMITTED)
BEGIN; |
UPDATE accounts |
SET balance = 700 |
WHERE id = 1; |
| SELECT balance FROM accounts
| WHERE id = 1; -- reads 700 (dirty!)
ROLLBACK; |
| -- T1 acted on a value that never existedBacaan Tidak Boleh Diulang: Takrif
Bacaan tidak boleh diulang berlaku apabila T1 membaca satu baris, T2 melakukan COMMIT terhadap kemas kini atau pemadaman pada baris yang sama, kemudian T1 membacanya semula dan melihat nilai yang berbeza.
Perhatikan perbezaan utama daripada bacaan kotor: di sini T2 telah melakukan COMMIT. Data itu sah, tetapi telah berubah tanpa disedari T1 dalam satu transaksi.
READ COMMITTED masih membenarkan keadaan ini. REPEATABLE READ dan tahap yang lebih tinggi mencegahnya dengan membaca daripada syot kilat yang stabil.
Bacaan Tidak Boleh Diulang: Garis Masa
T1 berjalan pada READ COMMITTED dan membaca baris yang sama dua kali. Antara dua bacaan itu, T2 melakukan COMMIT terhadap satu perubahan.
Kunci primer yang sama menghasilkan dua nilai berbeza dalam satu transaksi. Ketakkonsistenan itu boleh merosakkan logik berbilang langkah yang menganggap baris tersebut stabil.
-- T1 (READ COMMITTED) | -- T2
BEGIN; |
SELECT balance FROM accounts |
WHERE id = 1; -- 500 |
| BEGIN;
| UPDATE accounts SET balance = 900
| WHERE id = 1;
| COMMIT;
SELECT balance FROM accounts |
WHERE id = 1; -- 900 (changed!) |
COMMIT; |Bacaan Hantu: Takrif
Bacaan hantu berlaku apabila T1 menjalankan pertanyaan dengan syarat carian, T2 melakukan COMMIT bagi INSERT (atau DELETE) terhadap baris yang sepadan dengan syarat itu, kemudian T1 menjalankan semula pertanyaan dan melihat set baris yang berbeza.
Perbezaannya daripada bacaan tidak boleh diulang ialah: bacaan tidak boleh diulang berkaitan dengan nilai baris sedia ada yang berubah; bacaan hantu pula berkaitan dengan bilangan baris yang sepadan dengan predikat yang berubah.
Hanya SERIALIZABLE dijamin oleh piawaian untuk mencegah bacaan hantu.
Bacaan Hantu: Garis Masa
T1 mengira akaun bernilai tinggi dua kali. Antara dua kiraan itu, T2 memasukkan baris baharu yang menepati syarat dan melakukan COMMIT.
Tiada baris sedia ada berubah, namun COUNT berbeza. Baris baharu itu ialah "hantu" yang muncul dalam set hasil T1.
-- T1 (REPEATABLE READ, standard) | -- T2
BEGIN; |
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 3 |
| INSERT INTO accounts(id, balance)
| VALUES (99, 5000);
| COMMIT;
SELECT COUNT(*) FROM accounts |
WHERE balance > 1000; -- 4 (phantom)|
COMMIT; |Pemetaan Anomali kepada Tahap
Pemetaan ini ialah inti pati topik ini. Berikut ialah tahap terendah yang mencegah setiap anomali:
- Bacaan kotor dicegah mulai daripada
READ COMMITTEDdan ke atas. - Bacaan tidak boleh diulang dicegah mulai daripada
REPEATABLE READdan ke atas. - Bacaan hantu dicegah oleh
SERIALIZABLE(menurut piawaian).
Perhatikan bahawa nama-nama ini sepadan: REPEATABLE READ menjadikan bacaan boleh diulang; tahap-tahap itu dinamakan berdasarkan anomali yang baru sahaja dapat dicegahnya.
Bacaan Tidak Boleh Diulang berbanding Bacaan Hantu: Perbezaan Jelas
Inilah kekeliruan temu duga yang paling biasa. Ingat ayat ini:
Bacaan tidak boleh diulang = nilai baris sedia ada berubah. Bacaan hantu = set baris yang sepadan berubah (baris ditambah atau dibuang).
Uji diri: T2 menjalankan UPDATE ... WHERE id = 5 kemudian melakukan COMMIT, dan T1 membaca semula baris 5. Itu ialah bacaan tidak boleh diulang. T2 menjalankan INSERT bagi baris baharu yang sepadan dengan WHERE T1, kemudian T1 menjalankan semula pertanyaan. Itu ialah bacaan hantu.
Herotan Penulisan: Anomali Tambahan
Dalam temu duga lanjutan, penemuduga mungkin membawa perbincangan melangkaui tiga anomali piawai kepada herotan penulisan: dua transaksi masing-masing membaca set yang bertindih, melakukan penulisan yang tidak bertindih berdasarkan perkara yang dibaca, lalu kedua-duanya melakukan COMMIT sehingga terhasil keadaan yang tidak akan dibenarkan oleh mana-mana transaksi jika berjalan sendirian.
Contoh klasik: dua doktor sedang bertugas; setiap seorang memeriksa bahawa doktor lain sedang bertugas lalu mengeluarkan dirinya daripada jadual bertugas. Kedua-duanya berjaya, menyebabkan tiada doktor bertugas.
Pengasingan syot kilat (Postgres REPEATABLE READ) membenarkan herotan penulisan; hanya SERIALIZABLE menghalangnya. Menyebut perkara ini menunjukkan pemahaman yang mendalam.
Kemas Kini Hilang: Perangkap Keempat
Penemuduga kadangkala menyelitkan kemas kini yang hilang, yang tiada dalam senarai anomali piawaian tetapi kerap berlaku dalam amalan. Dua transaksi membaca nilai yang sama, kedua-duanya mengira nilai baharu daripadanya, lalu menulis semula nilai tersebut. Penulisan kedua menimpa penulisan pertama secara senyap.
Contoh: dua pemindahan masing-masing membaca baki 500, masing-masing menolak satu amaun, dan masing-masing menulis hasilnya. Salah satu penolakan itu hilang.
Pembetulannya bukan sekadar menggunakan tahap pengasingan yang lebih tinggi, tetapi juga penguncian eksplisit dengan SELECT ... FOR UPDATE, atau kemas kini atomik yang membuat pengiraan dalam pangkalan data, bukannya dalam aplikasi.
-- Safe pattern: lock the row, or compute atomically
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- locks row
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Or simply: UPDATE accounts SET balance = balance - 100 WHERE id = 1;Semakan Pantas
Kenal pasti anomali berdasarkan kelakuannya.
Imbas Kembali: Anomali dan Penyelesaiannya
Tiga anomali bacaan, setiap satunya diatasi oleh tahap pengasingan yang lebih tinggi:
- Bacaan kotor (data yang belum di-COMMIT) - diatasi pada READ COMMITTED.
- Bacaan tidak boleh diulang (nilai baris sedia ada berubah) - diatasi pada REPEATABLE READ.
- Bacaan hantu (set baris yang sepadan berubah) - diatasi pada SERIALIZABLE.
Kekalkan perbezaan jelas antara bacaan tidak boleh diulang dengan bacaan hantu, dan sebut herotan penulisan jika penemuduga mahukan lebih banyak. Seterusnya kita lihat cara enjin pangkalan data sebenarnya menguatkuasakan pengasingan: penguncian, kebuntuan dan MVCC.
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 “Bacaan Kotor, Tidak Boleh Diulang dan Hantu” percuma?
Ya — teks penuh “Bacaan Kotor, Tidak Boleh Diulang dan Hantu” 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 “Bacaan Kotor, Tidak Boleh Diulang dan Hantu”?
Tiga anomali bacaan serta tahap pengasingan yang menghalang setiap satunya. 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 3 daripada 4.
Berapa lamakah pelajaran “Bacaan Kotor, Tidak Boleh Diulang dan Hantu” 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
- Sifat ACID Diterangkan
- Empat Tahap Pengasingan
- Bacaan Kotor, Tidak Boleh Diulang dan Hantu
- Kebuntuan, Penguncian dan MVCC