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.)