Diberikan sistem yang menyediakan:
- Kontrol / versi konkurensi optimis per objek (menggunakan CAS - Check-and-Set)
- Transaksi yang tidak perlu menjangkau lebih dari satu objek.
- Isolasi Snapshot
Apakah sistem ini dianggap serial ?
Dari Isolasi Snapshot
Dalam anomali kemiringan penulisan, dua transaksi (T1 dan T2) secara bersamaan membaca kumpulan data yang tumpang tindih (misalnya nilai V1 dan V2), secara bersamaan membuat pembaruan terpisah (misalnya pembaruan T1 V1, pembaruan T2 V2), dan akhirnya secara bersamaan melakukan, tidak juga melihat pembaruan dilakukan oleh yang lain. Jika sistem serializable, anomali seperti itu tidak mungkin, karena T1 atau T2 harus terjadi "pertama", dan dapat dilihat oleh yang lain. Sebaliknya, isolasi snapshot memungkinkan anomali miring.
Sebagai contoh nyata, bayangkan V1 dan V2 adalah dua saldo yang dipegang oleh satu orang, Phil. Bank akan membiarkan V1 atau V2 mengalami defisit, asalkan total yang dimiliki keduanya tidak pernah negatif (yaitu V1 + V2 ≥ 0). Kedua saldo saat ini $ 100. Phil memulai dua transaksi secara bersamaan, T1 menarik $ 200 dari V1, dan T2 menarik $ 200 dari V2.
Berdasarkan hal ini tampaknya memiliki potensi untuk menulis miring adalah satu-satunya alasan untuk sistem yang menjamin Isolasi Snapshot tidak Serializable.
Namun, dalam sistem yang tidak memungkinkan transaksi untuk menjangkau beberapa objek (dalam contoh di atas V1 dan V2) tampaknya tidak mungkin terjadi penulisan skew .
Oleh karena itu, sistem yang dijelaskan di atas adalah serializable. Apakah ini benar?
sumber
Jawaban:
Tidak, saya tidak berpikir bahwa ketentuan Anda menghasilkan sistem yang harus kami pertimbangkan secara serial.
Isolasi snapshot adalah teknik yang memastikan transaksi melihat dataset yang sama di seluruh transaksi. Isolasi snapshot memberikan beberapa jaminan tetapi tidak mendefinisikan semua karakteristik yang diperlukan untuk memahami bagaimana transaksi benar-benar bekerja (kecuali kami memilih untuk mengonfigurasi isolasi snapshot dan MVCC).
Isolasi snapshot paling umum diimplementasikan menggunakan MVCC, Multi Versi Consistency Control. MVCC mendefinisikan lebih detail transaksi dalam konteks snapshot mereka: dikatakan mereka memerlukan isolasi hanya ketika menulis konflik (hanya lokasi, atau, nilai lokasi +, tergantung pada implementasi). MVCC menyediakan model konsistensi santai, dan menderita kemiringan menulis.
Model konsistensi santai sulit dipahami karena mereka seperti hibrida antara tanpa isolasi dan isolasi penuh.
Jadi, mari kita mulai dengan model konkurensi yang ketat terlebih dahulu. Dua transaksi harus diisolasi dari satu sama lain jika satu menulis ke data apa pun yang lainnya dibaca atau ditulis (dan sebaliknya ...).
Ketika kita tidak tahu mengapa suatu transaksi membaca data, kita harus menganggap bahwa pembacaan nilai yang berbeda dapat mengubah perilaku klien yang terlibat, itulah sebabnya kondisi transaksi yang tumpang tindih menunjukkan isolasi. Tanpa isolasi, pembacaan data basi dalam sebuah snapshot dapat dengan mudah menunjukkan konsistensi santai, istilah lain yang inkonsistensi, yaitu kesalahan.
Kami hanya perlu mempertimbangkan data yang tepat dibaca atau ditulis oleh transaksi, setiap data di luar yang ditetapkan tidak perlu dipertimbangkan. Namun, sangat penting untuk menyadari bahwa ketika kita berbicara tentang data yang dibaca oleh suatu transaksi, bahwa kita harus menyertakan semua dan semua "meta" data (dan data dan metadata dibaca oleh operasi meta seperti memeriksa kendala). Contoh data meta adalah / operasi meta adalah: identifikasi kunci primer baru yang unik; lainnya adalah jumlah seluruh kolom; yang lain adalah mencari sesuatu dan tidak menemukannya; rentang pencarian atau jumlah. Ini sesuai dengan komentar @ Matthew tentang mencegah duplikat, serta jawaban @Tersosauros, di mana ia menganggap status.
Misalnya, ini berarti bahwa dua transaksi tumpang tindih (memerlukan isolasi) ketika keduanya menyisipkan baris (dengan asumsi kendala kunci primer unik) karena memeriksa kendala kunci identik dengan membaca seluruh kolom kunci utama. Sebagai contoh lain, mencari sesuatu dan menemukannya seperti membaca satu nilai, namun, tidak menemukan itu seperti melihat setiap nilai dalam kolom.
MVCC hanya melindungi terhadap penulisan yang tumpang tindih atau bertentangan, tetapi tidak mencegah pembacaan (kecuali jika juga ditulis oleh transaksi itu). Jadi, untuk mendapatkan kesalahan konsistensi dalam MVCC, yang perlu kita lakukan adalah membaca sesuatu yang diubah oleh transaksi lain (di mana transaksi lainnya terjadi setelah snapshot former diperoleh, tetapi melakukan terlebih dahulu), sedangkan transaksi lainnya terus menggunakan data basi dan membuat keputusan apa pun secara berbeda berdasarkan pada data basi itu dibandingkan dengan apa yang seharusnya dilakukan data terkini. Lebih mudah disebabkan daripada yang Anda kira.
Konsistensi santai adalah cara lain untuk mengatakan berpotensi tidak konsisten, atau rawan kesalahan. (Konsistensi santai tidak boleh disamakan dengan konsistensi akhirnya, yang merupakan bentuk kesalahan populer lainnya yang rentan dari "NoSQL".)
Pada pertanyaan Anda, ketika Anda mengatakan bahwa transaksi tidak perlu menjangkau lebih dari satu objek, ini harus berlaku untuk membaca dan menulis, dan metadata (dan operasi meta), termasuk pemeriksaan konsistensi, keseluruhan agregat kolom, pengecekan absensi, pencarian jangkauan, dll. .: jika ya, maka sejauh ini bagus.
Namun...
Saya mengambilnya dari pertanyaan Anda bahwa Anda menggunakan snapshot isolation (MVCC) pada objek individual (katakanlah alih-alih penguncian objek). (Anda juga menyebutkan CAS; Saya pernah mendengar tentang compare-and-swap, dan, test-and-set, tetapi tidak check-and-set, meskipun saya menganggapnya serupa).
Menulis pertanyaan Anda menyarankan kepada saya bahwa "objek" memiliki lebih dari satu bidang, jika tidak, ketentuan pertanyaan itu tidak perlu.
Oleh karena itu, karena objek yang ditangani snapshott'ed / MVCC Anda memiliki lebih dari satu bidang, Anda cenderung menulis kemiringan dalam objek tunggal. Jika dua transaksi memperbarui objek yang sama pada saat yang sama, seseorang dapat membaca bidang nilai objek yang dibuat basi oleh transaksi lain bersamaan pada objek yang sama, dan melanjutkan tanpa mengetahui, dengan demikian, potensi inkonsistensi (alias kesalahan).
Anda bisa menggunakan penguncian objek sebagai gantinya, yang akan mencegah dua transaksi (untuk pembaruan) dari bahkan melihat objek yang sama jika transaksi lain sudah dalam proses melakukannya.
Saya percaya bahwa bentuk alternatif isolasi snapshot dapat dilakukan tanpa menggunakan model perbandingan write-set only MVCC yang rusak. Jadi, Anda dapat (secara algoritmik) mempromosikan set perbandingan dari write-only untuk menyertakan juga set read. Kemudian dua transaksi yang memperbarui objek yang sama tidak akan dapat menyebabkan kemiringan tulis (karena yang mencoba melakukan kemudian akan dibatalkan). Saya pikir ini mungkin solusi yang tepat untuk masalah yang Anda gambarkan, karena Anda sudah mendapatkan sebagian besar manfaat yang akan dibeli MVCC kepada kami, dengan menghalangi transaksi multi-objek.
(Kita hanya perlu mempertimbangkan item / bidang yang tepat dan spesifik yang dibaca atau ditulis, tetapi kita harus memasukkan yang dibaca sebagai metadata, berpotensi selama operasi meta untuk mencegah kemiringan penulisan (mis. Kesalahan). Jika kita menghapus salah satu set baca dari set perbandingan , atau kami gagal mempertimbangkan metadata (berpotensi digunakan oleh operasi meta), maka kami memiliki model yang memungkinkan kesalahan.)
sumber
Saya pikir, seperti yang dinyatakan oleh @ pjc50 , (Penekanan ditambahkan :) " jika transaksi terbatas untuk membaca / menulis satu objek" maka "jawabannya adalah ya". Namun, saya pikir di mana ini jatuh adalah gagasan tentang satu objek.
Dalam contoh yang diambil dari isolasi Snapshot , T1 dan T2 tidak berbagi nilai apa pun. Namun, mereka masih potensi untuk menulis miring karena " tidak [memiliki] melihat pembaruan yang dilakukan oleh yang lain " sumber . Oleh karena itu, kemampuan transaksi untuk melihat semua pembaruan lainnya sebelum melakukan yang membuat transaksi benar-benar serial.
Dari serializability :
Sayangnya, karena ini (dan seperti yang ditunjukkan oleh @Matthew Mark Miller ), kita juga harus mempertimbangkan status serta nilai. Dengan pertimbangan ini, dua transaksi menggunakan OCC akan memiliki potensi untuk menulis miring setiap kali ada kondisi database yang ditulis .
sumber