Saya akan masuk ke dalam ini dengan peringatan umum yang saya akui saya bahkan belum melihat hasilnya, tetapi prinsip-prinsip dasar tampaknya valid bagi saya sejak awal.
Apa yang perlu Anda pertimbangkan di sini adalah "apa yang sebenarnya terjadi di bawah tenda" dari "gula sintaksis yang bagus" yang Anda hadapi dalam panggilan umum. Apa artinya ini pada dasarnya adalah melihat apa yang sebenarnya dilakukan oleh "bentuk perintah" dari operasi yang Anda panggil. Dalam hal ini "update" .
Jadi, jika Anda sudah melihat tautan itu, pertimbangkan "Bulk " formulir pembaruan:
var bulk = db.collection.initializeOrdedBulkOp();
bulk.find({ "_id": 1 }).updateOne({ "$set": { "a": 1 } });
bulk.find({ "_id": 2 }).updateOne({ "$set": { "b": 2 } });
bulk.execute();
Sekarang Anda sudah tahu bahwa ini dikirim ke server sebagai satu permintaan, tetapi apa yang kemungkinan besar tidak Anda pertimbangkan adalah bahwa "permintaan" sebenarnya yang dibuat "di bawah tenda" sebenarnya adalah ini:
db.runCommand({
"update": "collection",
"updates": [
{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } },
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
],
"ordered": true
})
Oleh karena itu masuk akal bahwa apa yang sebenarnya Anda lihat di log di bawah operasi "perbarui" sebenarnya adalah sesuatu seperti (disingkat dari output penuh menjadi hanya kueri):
{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } }
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
Oleh karena itu, artinya setiap tindakan tersebut dengan perintah terkait ada di oplog untuk "memutar ulang" pada replikasi dan/atau pada tindakan lain yang mungkin Anda lakukan seperti "memutar ulang" entri oplog secara khusus.
Saya yakin itulah yang sebenarnya terjadi bahkan tanpa melihat, karena saya tahu bagaimana driver mengimplementasikan panggilan yang sebenarnya, dan masuk akal bahwa setiap panggilan disimpan dalam oplog dengan cara ini.
Oleh karena itu "secara keseluruhan", maka tidak ada. Ini bukan "transaksi" dan selalu merupakan operasi yang berbeda bahkan jika pengiriman dan pengembaliannya berada dalam permintaan tunggal. Tapi mereka tidak operasi tunggal, dan karena itu tidak akan dan tidak boleh direkam seperti itu.