Saya bukan ahli basis data dan tidak memiliki latar belakang ilmu komputer formal, jadi bersabarlah. Saya ingin mengetahui hal-hal negatif dunia nyata yang dapat terjadi jika Anda menggunakan versi MongoDB lama sebelum v4 , yang tidak sesuai dengan ACID . Ini berlaku untuk semua basis data ACID yang tidak patuh.
Saya mengerti bahwa MongoDB dapat melakukan Operasi Atom , tetapi mereka tidak "mendukung penguncian tradisional dan transaksi kompleks", kebanyakan karena alasan kinerja. Saya juga memahami pentingnya transaksi basis data, dan contoh kapan basis data Anda untuk bank, dan Anda memperbarui beberapa catatan yang semuanya harus disinkronkan, Anda ingin transaksi kembali ke keadaan awal jika ada pemadaman listrik sehingga kredit sama dengan pembelian, dll.
Tetapi ketika saya masuk ke percakapan tentang MongoDB, kita yang tidak tahu detail teknis tentang bagaimana database sebenarnya dilaksanakan mulai melemparkan pernyataan seperti:
MongoDB jauh lebih cepat daripada MySQL dan Postgres, tetapi ada kemungkinan kecil, seperti 1 dalam sejuta, "itu tidak akan disimpan dengan benar".
Bagian "tidak akan disimpan dengan benar" mengacu pada pemahaman ini: Jika ada pemadaman listrik tepat saat Anda menulis ke MongoDB, ada peluang untuk catatan tertentu (misalnya Anda melacak tampilan halaman dalam dokumen dengan 10 atribut masing-masing), bahwa salah satu dokumen hanya menyimpan 5 atribut ... yang berarti seiring waktu penghitung tampilan halaman Anda akan "sedikit" mati. Anda tidak akan pernah tahu seberapa banyak, Anda tahu mereka akan menjadi 99,999% benar, tetapi tidak 100%. Ini karena, kecuali jika Anda secara khusus menjadikan ini operasi atom mongodb , operasi tersebut tidak dijamin sebagai atom.
Jadi pertanyaan saya adalah, apa interpretasi yang benar tentang kapan dan mengapa MongoDB mungkin tidak "menyelamatkan dengan benar"? Bagian mana dari ACID yang tidak memuaskan, dan dalam keadaan apa, dan bagaimana Anda tahu kapan 0,001% data Anda tidak aktif? Tidak bisakah ini diperbaiki? Jika tidak, ini tampaknya berarti Anda tidak boleh menyimpan hal-hal seperti users
meja Anda di MongoDB, karena catatan mungkin tidak menyimpan. Tetapi sekali lagi, bahwa pengguna 1 / 1.000.000 mungkin hanya perlu "mencoba mendaftar lagi", bukan?
Saya hanya mencari mungkin daftar kapan / mengapa hal-hal negatif terjadi dengan database tidak patuh ACID seperti MongoDB, dan idealnya jika ada solusi standar (seperti menjalankan pekerjaan latar belakang untuk membersihkan data, atau hanya menggunakan SQL untuk ini, dll.) .
Sebenarnya tidak benar bahwa MongoDB tidak sesuai dengan ACID. Sebaliknya, MongoDB adalah ACID-compilant di tingkat dokumen .
Setiap pembaruan pada satu dokumen adalah
Apa yang tidak dimiliki MongoDB adalah transaksi - yaitu, pembaruan banyak dokumen yang dapat dibatalkan dan sesuai dengan ACID.
Perhatikan bahwa Anda dapat membangun transaksi di atas pembaruan yang sesuai dengan ACID ke satu dokumen, dengan menggunakan komit dua fase .
sumber
Penjelasan yang baik tercantum dalam "Starbucks Tidak Menggunakan Komitmen Dua Fase" .
Ini bukan tentang basis data NoSQL, tetapi menggambarkan titik yang kadang-kadang Anda mampu kehilangan transaksi atau memiliki database Anda dalam keadaan tidak konsisten untuk sementara waktu.
Saya tidak akan menganggapnya sebagai sesuatu yang perlu "diperbaiki". Cara mengatasinya adalah dengan menggunakan database relasional ACID-compliant. Anda memilih alternatif NoSQL ketika perilakunya memenuhi persyaratan aplikasi Anda.
sumber
Saya pikir orang lain sudah memberikan jawaban yang baik. Namun saya ingin menambahkan bahwa ada ACID NOSQL DBs (seperti http://ravendb.net/ ). Jadi bukan hanya keputusan NOSQL - tidak ada ACID vs Relasional dengan ACID ....
sumber
"tidak akan menyimpan dengan benar" dapat berarti:
Secara default MongoDB tidak langsung menyimpan perubahan Anda ke drive. Jadi ada kemungkinan Anda memberi tahu pengguna "pembaruan berhasil", pemadaman listrik terjadi dan pembaruan hilang. MongoDB menyediakan opsi untuk mengontrol tingkat pembaruan "daya tahan". Bisa menunggu replika lain menerima pembaruan ini (dalam memori), menunggu penulisan terjadi pada file jurnal lokal, dll.
Tidak ada pembaruan "atom" yang mudah untuk banyak koleksi dan bahkan banyak dokumen dalam koleksi yang sama. Dalam kebanyakan kasus, ini bukan masalah karena dapat dielakkan dengan Two Phase Commit , atau merestrukturisasi skema Anda sehingga pembaruan dibuat untuk satu dokumen. Lihat pertanyaan ini: Database Dokumen: Data berlebihan, referensi, dll. (Khusus MongoDB)
sumber
Pada MongoDB v4.0, transaksi ACID multi-dokumen harus didukung. Melalui isolasi snapshot, transaksi akan memberikan tampilan data yang konsisten secara global, dan menegakkan eksekusi semua atau tidak sama sekali untuk menjaga integritas data.
Mereka merasa seperti transaksi dari dunia relasional, misalnya:
Lihat https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb
sumber
Harap baca tentang properti ACID untuk mendapatkan pemahaman yang lebih baik.
Juga dalam dokumentasi MongoDB Anda dapat menemukan pertanyaan dan jawaban .
A
pada tingkat dokumen saja. Itu tidak sesuai dengan definisi atom yang kita ketahui dari sistem basis data relasional, khususnya tautan di atas. Dalam hal ini MongoDB tidak mematuhi A dari ACID.C
onsitent secara default. Namun, Anda dapat membaca dari server sekunder dalam set replika. Anda hanya dapat memiliki konsistensi akhirnya dalam kasus ini. Ini berguna jika Anda tidak keberatan membaca data yang sedikit usang.I
solasi (sekali lagi sesuai dengan definisi di atas):D
urability - Anda dapat mengkonfigurasi perilaku ini denganwrite concern
opsi, tidak yakin sekalipun. Mungkin seseorang lebih tahu.Saya percaya beberapa penelitian sedang berlangsung untuk memindahkan NoSQL ke kendala ACID atau serupa. Ini adalah tantangan karena database NoSQL biasanya cepat (er) dan kendala ACID dapat memperlambat kinerja secara signifikan.
sumber
Satu-satunya alasan atom memodifikasi kerja terhadap satu-koleksi adalah karena pengembang mongodb baru-baru ini bertukar kunci database dengan kunci-lebar koleksi koleksi. Memutuskan bahwa peningkatan konkurensi di sini sepadan dengan trade-off. Pada intinya, mongodb adalah file yang dipetakan memori: mereka telah mendelegasikan manajemen buffer-pool ke subsistem vm mesin. Karena selalu ada dalam memori, mereka dapat lolos dengan kunci berbutir saja: Anda akan melakukan operasi dalam-memori saja sambil memegangnya, yang akan sangat cepat. Ini berbeda secara signifikan dari sistem basis data tradisional yang terkadang dipaksa untuk melakukan I / O sambil memegang pagelock atau rowlock.
sumber
"Dalam MongoDB, operasi pada satu dokumen adalah atom" - Itulah yang terjadi di masa lalu
Dalam versi baru MongoDB 4.0 Anda BISA:
Meskipun ada beberapa batasan untuk operasi Bagaimana dan Apa yang dapat dilakukan.
Periksa Mongo Doc. https://docs.mongodb.com/master/core/transactions/
sumber
Anda dapat menerapkan pembaruan multi-kunci atom (transaksi serializable) di sisi klien jika penyimpanan Anda mendukung per linearitas kunci dan membandingkan dan mengatur (yang berlaku untuk MongoDB). Pendekatan ini digunakan di Google Percolator dan di CockroachDB tetapi tidak ada yang mencegah Anda menggunakannya dengan MongoDB.
Saya telah membuat visualisasi langkah demi langkah dari transaksi tersebut. Saya harap ini akan membantu Anda untuk memahaminya.
Jika Anda baik-baik saja dengan tingkat isolasi yang dilakukan baca maka masuk akal untuk melihat transaksi RAMP oleh Peter Bailis. Mereka juga dapat diimplementasikan untuk MongoDB di sisi klien.
sumber