在下面的示例代码中,如果事务中检索到的数据在结束或提交之前发生更改(由外部/独立写入操作引起),会发生什么?交易会自动中止吗?
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);
我阅读了有关事务的文档,据我所知,它主要提供数据原子性和持久性,但我无法找到如果任何读数据因外部/单独的写操作而更改,事务会发生什么情况
1条答案
按热度按时间qojgxg4l1#
默认情况下,MongoDB事务提供
snapshot isolation
,这确保了在事务期间读取的数据与事务开始时的数据一致。在事务外部对数据所做的更改不会显示在事务中。即使单独的写操作修改了数据,从
coll1.find
操作中检索到的数据在提供的代码中也将保持不变。无论在事务期间进行任何数据修改,都将继续使用在事务开始时获取的数据的初始快照。因此,如果单独的写入操作导致对检索到的数据的更改,则事务将不会自动终止。它将使用数据的初始快照向前移动,并将基于该快照应用任何更新或修改。假设另一个交换提交了对与正在进行的交换竞争的信息的更改,则当正在进行的交换尝试提交时将发生竞争,并且事务将被回滚。
所以间接地是的,如果事务在结束或提交之前检索到的数据发生更改,事务将自动中止。