如果在事务中读取的文档在事务内部更改之前被其他客户端更改,mongodb事务是否会失败?
在我的应用程序中,我正在使用mongodb进行以下操作如果在事务中读取的文档在事务内部更改之前被其他客户端更改,mongodb事务是否会失败?,mongodb,transactions,Mongodb,Transactions,在我的应用程序中,我正在使用mongodb进行以下操作 启动mongodb会话并启动事务 阅读文件 根据文档中的值和一些其他参数进行一些计算 使用步骤3中的计算结果更新步骤2中读取的文档 提交事务并结束会话 上述过程在TransientTransactionError上执行,因此如果事务因并发问题而失败,则会重试该过程 如果对上述过程进行了两次并发调用,如果两次调用都在写入文档之前读取了文档,那么我只需要一次调用就可以成功写入文档,而另一次调用则失败。如果这种情况没有发生,我就不会得到我试图通过
TransientTransactionError
上执行,因此如果事务因并发问题而失败,则会重试该过程
如果对上述过程进行了两次并发调用,如果两次调用都在写入文档之前读取了文档,那么我只需要一次调用就可以成功写入文档,而另一次调用则失败。如果这种情况没有发生,我就不会得到我试图通过这种方式实现的预期结果
在这种情况下,我是否可以期望mongodb在一次调用中失败,因此将根据文档的更新图片重试该过程?是原子的(即提供“全部或无”命题)。当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。也就是说,事务在回滚其他更改时不会提交其部分更改
这一点也在以下章节中进一步阐述:
如果事务正在进行,并且在事务外部写入
修改事务中的操作稍后尝试的文档
若要修改,事务将由于写入冲突而中止
如果事务正在进行且已锁定以修改
文档,当事务外部的写入尝试修改
在同一文档中,写入操作将等待事务结束
另请参见“写入冲突”部分,以进一步了解多文档事务(即写入锁等) 是原子的(即提供一个“全部或无”命题)。当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。也就是说,事务在回滚其他更改时不会提交其部分更改
这一点也在以下章节中进一步阐述:
如果事务正在进行,并且在事务外部写入
修改事务中的操作稍后尝试的文档
若要修改,事务将由于写入冲突而中止
如果事务正在进行且已锁定以修改
文档,当事务外部的写入尝试修改
在同一文档中,写入操作将等待事务结束
另请参见“写入冲突”部分,以进一步了解多文档事务(即写入锁等)