MongoDB 4.2 부터 sharded cluster에서 multi-document 트랜잭션 가능.

 

// 아무 document 하나 insert
[direct: mongos] mydb> db.mycol.insertOne({name:'백충덕'})
{
  acknowledged: true,
  insertedId: ObjectId("6475b9cf969200cfb665e179")
}
// 세션 시작
[direct: mongos] mydb> sess1 = db.getMongo().startSession()
{ id: UUID("0369c0f2-d121-42a5-a326-4e7cf57e5e8e") }
// 트랜잭션 시작
[direct: mongos] mydb> sess1.startTransaction()
 
// 트랜잭션에서 update
[direct: mongos] mydb> sess1.getDatabase('mydb').mycol.updateOne({name:'백충덕'}, {$set:{age:100}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
 
// 세션 외부에서 확인. 아직 적용되지 않음
[direct: mongos] mydb> db.mycol.findOne({name:'백충덕'})
{ _id: ObjectId("6475b9cf969200cfb665e179"), name: '백충덕' }
// 세션 내부에서 확인. 적용되어 있음
[direct: mongos] mydb> sess1.getDatabase('mydb').mycol.findOne({name:'백충덕'})
{ _id: ObjectId("6475b9cf969200cfb665e179"), name: '백충덕', age: 100 }
// 트랜잭션 커밋
[direct: mongos] mydb> sess1.commitTransaction()
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1685436922, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("14552845291f2b68b740c1e98f55389210ed10bd", "hex"), 0),
      keyId: Long("7231062885789597709")
    }
  },
  operationTime: Timestamp({ t: 1685436922, i: 1 }),
  recoveryToken: { recoveryShardId: 'shard_002' }
}
// 세션 외부에서도 적용된 것을 확인
[direct: mongos] mydb> db.mycol.findOne({name:'백충덕'})
{ _id: ObjectId("6475b9cf969200cfb665e179"), name: '백충덕', age: 100 }
 
// 세션 종료
[direct: mongos] mydb> sess1.endSession()

 

생각해보니 이건 multi-document는 아니지만...

 

 

 

Posted by bloodguy
,