关于MongoDB事务隔离的问题

w51jfk4q  于 2023-06-29  发布在  Go
关注(0)|答案(1)|浏览(131)

在下面的示例代码中,如果事务中检索到的数据在结束或提交之前发生更改(由外部/独立写入操作引起),会发生什么?交易会自动中止吗?

await session.withTransaction(async () => {
  const coll1 = client.db('mydb1').collection('foo');

  await coll1.find( { qty: { $gt: 4 } }, { session } );
  
  // some code before update
  // if the retrieved data from the above, changed due to a separate write operation, will this transaction abort?

  await coll1.update( 
    { id: 3 },
    { $set: { qty: 2 } },
    { session }
  )

}, transactionOptions);

我阅读了有关事务的文档,据我所知,它主要提供数据原子性和持久性,但我无法找到如果任何读数据因外部/单独的写操作而更改,事务会发生什么情况

qojgxg4l

qojgxg4l1#

默认情况下,MongoDB事务提供snapshot isolation,这确保了在事务期间读取的数据与事务开始时的数据一致。在事务外部对数据所做的更改不会显示在事务中。
即使单独的写操作修改了数据,从coll1.find操作中检索到的数据在提供的代码中也将保持不变。无论在事务期间进行任何数据修改,都将继续使用在事务开始时获取的数据的初始快照。
因此,如果单独的写入操作导致对检索到的数据的更改,则事务将不会自动终止。它将使用数据的初始快照向前移动,并将基于该快照应用任何更新或修改。假设另一个交换提交了对与正在进行的交换竞争的信息的更改,则当正在进行的交换尝试提交时将发生竞争,并且事务将被回滚。
所以间接地是的,如果事务在结束或提交之前检索到的数据发生更改,事务将自动中止。

相关问题