Login
网站首页 > 文章中心 > 其它

mongoDB_4.0事务回滚的辛酸历程探究

作者:小编 更新时间:2023-08-12 11:36:18 浏览量:420人看过

概述

示例一

首先,我们来看一个简单的例子:


mongoDB_4.0事务回滚的辛酸历程探究-图1

async function runTxn() { let session = client.startSession({defaultTransactionOptions: {readConcern: {level: 'local'}}}); session.startTransaction(); try { session.endSession(); } }

这个问题的原因是用户在抛出异常后没有立即终止事务,导致事务虽然抛出了异常但仍被提交.

在这个例子中,我们可以通过在事务代码块的最后添加throw err;的语句,来修复这个问题.

async function runTxn() {
  let session = client.startSession({defaultTransactionOptions: {readConcern: {level: 'local'}}});
  session.startTransaction();
  try {
session.endSession();
  }
}

示例二

此时此刻呢,让我们看看另一个例子:

async function runTxn() {
  let session = client.startSession({defaultTransactionOptions: {readConcern: {level: 'local'}}});
  session.startTransaction();
  try {
session.endSession();
  }
}

如果在这个例子中发生了一个故障,比如是机器宕机,我们再次启动mongoDB时,会收到"Prepare transaction error"的错误消息.

这是因为我们没有清理事务状态.在我们的代码中,我们没有在catch块中设置或删除Mongo.Collection状态.如果我们在catch块中添加以下行:

MongoInternals.NpmModules.mongodb_client_session.modernized((clientSession) => {
  clientSession  clientSession.abortTransaction();
});

可以解决这个问题并正确地回滚事务.

总结

以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章