MongoDB临界截面

MongoDB临界截面,mongodb,Mongodb,我需要在mongodb上执行一些操作(读和写),而不需要另一个进程中断。它适用于在线游戏,当用户向另一个用户发送资源时,将执行以下步骤: 检查他的资源价值 如果还不够,就中止 插入资源事务 降低他的资源价值 增加其他资源的价值 我担心的是,在检查它是否足够或插入资源事务时,其他事务已经被插入,并且值变得无效。如何确保此部分按此顺序执行?我可以看到两种方法: 使用客户端事务持有“锁”: 或者在此处使用版本控制,即您持有一个带有$inc'd版本号的字段,该版本号在每次保存时都会更新,并且在每次保存

我需要在mongodb上执行一些操作(读和写),而不需要另一个进程中断。它适用于在线游戏,当用户向另一个用户发送资源时,将执行以下步骤:

  • 检查他的资源价值
  • 如果还不够,就中止
  • 插入资源事务
  • 降低他的资源价值
  • 增加其他资源的价值
  • 我担心的是,在检查它是否足够或插入资源事务时,其他事务已经被插入,并且值变得无效。如何确保此部分按此顺序执行?

    我可以看到两种方法:

    • 使用客户端事务持有“锁”:

    • 或者在此处使用版本控制,即您持有一个带有
      $inc
      'd版本号的字段,该版本号在每次保存时都会更新,并且在每次保存时都必须由查询。Vermongo内部就是一个很好的例子:

    这似乎是我看到的完成这项工作的两种最合理的方法。

    我可以看到两种方法:

    • 使用客户端事务持有“锁”:

    • 或者在此处使用版本控制,即您持有一个带有
      $inc
      'd版本号的字段,该版本号在每次保存时都会更新,并且在每次保存时都必须由查询。Vermongo内部就是一个很好的例子:


    这似乎是我所看到的两种最合理的方式来完成这项工作。

    在谈到mongo时,事务几乎是一个禁忌词。但是,您可以使用
    $inc
    使用资源值作为条件,使用原子上行执行步骤1、2和4,然后执行步骤3和5。如果后续步骤失败,您将不支持在步骤上回滚。

    在谈到mongo时,事务几乎是一个禁止使用的词。但是,您可以使用
    $inc
    使用资源值作为条件,使用原子上行执行步骤1、2和4,然后执行步骤3和5。如果后续步骤失败,您将不支持在步骤上回滚。

    我是Tokutek的工程师

    TokuMX是一个MongoDB替换服务器,它使用相同的协议和驱动程序,并在非分片设置上支持本机多语句事务。您想要的可以通过可序列化事务来完成,该事务将对您接触的文档进行文档级锁定。这将是这样做的

    > db.beginTransaction("serializable");
    > if (resourcesInsufficient()) { db.rollbackTransaction(); }
    > // insert and update
    > db.commitTransaction()
    
    同样,这在切分中不受支持,但可能对您的应用程序有用。更多的细节、特点和局限性将在本文中讨论。

    我是Tokutek的工程师

    TokuMX是一个MongoDB替换服务器,它使用相同的协议和驱动程序,并在非分片设置上支持本机多语句事务。您想要的可以通过可序列化事务来完成,该事务将对您接触的文档进行文档级锁定。这将是这样做的

    > db.beginTransaction("serializable");
    > if (resourcesInsufficient()) { db.rollbackTransaction(); }
    > // insert and update
    > db.commitTransaction()
    

    同样,这在切分中不受支持,但可能对您的应用程序有用。更多的细节、功能和限制都会被讨论。

    这并不是一个很好的例子来说明你的要求。您最好编辑您的问题,以包含您的操作用例和一些指向您如何操作的代码。否则,这充其量只是征求意见,结果会被关闭。这并不是你所要求的一个好例子。您最好编辑您的问题,以包含您的操作用例和一些指向您如何操作的代码。否则,这充其量只是征求意见,结果将被关闭。谢谢!我想因为我想能够回滚,我将使用Sammaye发布的解决方案。谢谢!我想因为我想能够回滚,我将使用Sammaye发布的解决方案。谢谢!但是我已经根据前面的答案重写了代码的部分:/谢谢!但我已经根据前面的答案重写了代码的部分:/