首先,我们来看一个简单的例子:
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();
});
可以解决这个问题并正确地回滚事务.
以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!