mongodb4.0 事务回滚问题

跟着网上的例子写无法回滚?

db.col.find()
{ "_id" : ObjectId("5b845237d63ff6fb1220861c"), "name" : "ccy" }
{ "_id" : ObjectId("5b8453f5cf6edbf8ffc60a95"), "name" : "ssy" }
{ "_id" : ObjectId("5b8456dcf580719bba707dc1"), "name" : "ccc" }

s = db.getMongo().startSession()
session { "id" : UUID("33f4e714-a59d-4e83-8750-011bb0b9d637") }
s.startTransaction()
db.col.insert({name: 'mongo'})
WriteResult({ "nInserted" : 1 })
s.abortTransaction()
db.col.find()
{ "_id" : ObjectId("5b845237d63ff6fb1220861c"), "name" : "ccy" }
{ "_id" : ObjectId("5b8453f5cf6edbf8ffc60a95"), "name" : "ssy" }
{ "_id" : ObjectId("5b8456dcf580719bba707dc1"), "name" : "ccc" }
{ "_id" : ObjectId("5b8458e726a5a62d9970c900"), "name" : "mongo" }

如图那样, 开启了一个事务, 插入了一天数据, 后回滚事务。 但是数据还是插入进去了?
请教大神这是为什么

阅读 3.9k
1 个回答

可能你看的例子写得就不正确。
从设计的角度讲你的sessiondb.col集合没有任何关联,系统怎么会知道这个session怎么会作用于这个集合上呢?真实环境中会有多个session,多个集合,系统必须有一定的方法来知道对应关系,所以现在的写法肯定是欠妥的。正确的写法是:

s = db.getMongo().startSession();
s.startTransaction();
s.getDatabase("<database>").col.insert({name: 'mongo'});
s.abortTransaction();
db.col.find();

事实上在你commit之前都不应该在集合中查询到新插入记录。所以之前的写法这点就已经不吻合了。
更多实例参考MongoDB官方文档:Session.startTransaction

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题