Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在事务中读取的文档在事务内部更改之前被其他客户端更改,mongodb事务是否会失败?_Mongodb_Transactions - Fatal编程技术网

如果在事务中读取的文档在事务内部更改之前被其他客户端更改,mongodb事务是否会失败?

如果在事务中读取的文档在事务内部更改之前被其他客户端更改,mongodb事务是否会失败?,mongodb,transactions,Mongodb,Transactions,在我的应用程序中,我正在使用mongodb进行以下操作 启动mongodb会话并启动事务 阅读文件 根据文档中的值和一些其他参数进行一些计算 使用步骤3中的计算结果更新步骤2中读取的文档 提交事务并结束会话 上述过程在TransientTransactionError上执行,因此如果事务因并发问题而失败,则会重试该过程 如果对上述过程进行了两次并发调用,如果两次调用都在写入文档之前读取了文档,那么我只需要一次调用就可以成功写入文档,而另一次调用则失败。如果这种情况没有发生,我就不会得到我试图通过

在我的应用程序中,我正在使用mongodb进行以下操作

  • 启动mongodb会话并启动事务
  • 阅读文件
  • 根据文档中的值和一些其他参数进行一些计算
  • 使用步骤3中的计算结果更新步骤2中读取的文档
  • 提交事务并结束会话
  • 上述过程在
    TransientTransactionError
    上执行,因此如果事务因并发问题而失败,则会重试该过程

    如果对上述过程进行了两次并发调用,如果两次调用都在写入文档之前读取了文档,那么我只需要一次调用就可以成功写入文档,而另一次调用则失败。如果这种情况没有发生,我就不会得到我试图通过这种方式实现的预期结果

    在这种情况下,我是否可以期望mongodb在一次调用中失败,因此将根据文档的更新图片重试该过程?

    是原子的(即提供“全部或无”命题)。当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。也就是说,事务在回滚其他更改时不会提交其部分更改

    这一点也在以下章节中进一步阐述:

    如果事务正在进行,并且在事务外部写入 修改事务中的操作稍后尝试的文档 若要修改,事务将由于写入冲突而中止

    如果事务正在进行且已锁定以修改 文档,当事务外部的写入尝试修改 在同一文档中,写入操作将等待事务结束

    另请参见“写入冲突”部分,以进一步了解多文档事务(即写入锁等)

    是原子的(即提供一个“全部或无”命题)。当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。也就是说,事务在回滚其他更改时不会提交其部分更改

    这一点也在以下章节中进一步阐述:

    如果事务正在进行,并且在事务外部写入 修改事务中的操作稍后尝试的文档 若要修改,事务将由于写入冲突而中止

    如果事务正在进行且已锁定以修改 文档,当事务外部的写入尝试修改 在同一文档中,写入操作将等待事务结束

    另请参见“写入冲突”部分,以进一步了解多文档事务(即写入锁等)