Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Кстати, даже с включенном журналированием мы можем получить выйгрыш в скорости за счет шардирования.
Но вот за что любят SQL — так это то, что если тебе на commit вернули «угу», значит данные на диске. Точно. И в правильном порядке.
// начальное состояние
db.var.save({name: "a", value: 1, tx: []})
db.var.save({name: "b", value: 1, tx: []})
// создаем транзакции (будем считать, что мы их уже перевели в pending)
db.txs.save({changes : [{a : 2}, {b : 2}], state: "pending"})
// { "_id" : ObjectId("5072b0ee39d8ecf4ceb7865b"), "changes" : [ { "a" : 2 }, { "b" : 2 } ], "state" : "initial" }
db.txs.save({changes : [{a : 3}, {b : 3}], state: "pending"})
// { "_id" : ObjectId("5072b3ca39d8ecf4ceb7865c"), "changes" : [ { "a" : 3 }, { "b" : 3 } ], "state" : "initial" }
// константы
var tx1 = db.txs.findOne({_id:ObjectId("5072b0ee39d8ecf4ceb7865b")})
var tx2 = db.txs.findOne({_id:ObjectId("5072b3ca39d8ecf4ceb7865c")})
// step2 из туториала (две транзакции в перемешку)
db.vars.update({name: "a", tx: {$ne: tx1._id}}, {$set: {value: 2}, $push: {tx: tx1._id}})
// оба-на уже неконсистентное состояние a=2, b=1, но это можно простить так как транзакции еще выполняются
db.vars.update({name: "b", tx: {$ne: tx2._id}}, {$set: {value: 3}, $push: {tx: tx2._id}})
db.vars.update({name: "b", tx: {$ne: tx1._id}}, {$set: {value: 2}, $push: {tx: tx1._id}})
db.vars.update({name: "a", tx: {$ne: tx2._id}}, {$set: {value: 3}, $push: {tx: tx2._id}})
// остальные шаги я опустил, так как они не меняют value
// состояние базы после успешного завершения транзакций
db.vars.find()
// { "_id" : ObjectId("5072b07739d8ecf4ceb7865a"), "name" : "a", "tx" : [ ], "value" : 3 }
// { "_id" : ObjectId("5072b06f39d8ecf4ceb78659"), "name" : "b", "tx" : [ ], "value" : 2 }
Транзакции в MongoDB