代码之家  ›  专栏  ›  技术社区  ›  Mohamad

我是否应该使用cflock?

  •  4
  • Mohamad  · 技术社区  · 15 年前

    我想知道在这种情况下是否需要锁定表(我使用的是Coldfusion和MySQL):

    wishlists(memberId, gameId, rank, updateAt) 会员在个人列表中存储游戏的地方。

    wishlists 有一个男人对许多人 members 一张桌子,一对多 games 桌子。许多成员在这个列表中存储了许多游戏。这些游戏使用int字段进行排名。等级对成员来说是特殊的,所以:

    Member 1 can have itemId=1, rank=1; itemId=2, rank=2
    Member 2 can have itemId=1, rank=1, itemId=2, rank=2
    etc...
    

    每个成员都可以通过删除项目或更改项目的排名来修改其列表( ,例如)。这意味着每次对列表进行更改时,必须重新对列表进行排序。我编写了一个单独的函数 rankList() 删除游戏源列表() 发送游戏topoflist()

    1. Gets a memberWishlist query of all records @memberId ordered first by **rank ASC**, then **updateAt ASC** fields 
    2. Loops through memberWishlist query and sets each row's **rank=memberWishlist.RecordCount**
    

    updateAt字段是必要的,因为如果一个游戏被移动到列表的顶部,我们将有两个排名第一的项目,为了区分它们,我使用updatedAt。

    :一个成员的列表中有100个游戏:

    1. 成员将项移到顶部;在操作完成后调用rankList()。

    在普通的页面请求中,这很好,因为在rankList()完成之前,页面不会重新加载。但是如果是ajax,或者使用cfthread,成员可以通过快速点击在5秒内删除10个游戏。然后,不管怎样,删除后列表会重新排序,所以这可能无关紧要;但似乎这是我应该保护的。。。

    情景2:

    感谢你的想法。

    附加信息:新项目在插入时自动排在最后

    1 回复  |  直到 13 年前
        1
  •  2
  •   Ben Doom    15 年前

    不,CFLock不会有 任何

    但是,您可能需要一个事务。将多个操作包装到一个事务块中会告诉MySQL,您希望确保在永久存储更改之前完成所有操作。

    这假设您的多个查询是在CF中生成的,如下所示:

    <cffunction sendToTopOfList()>
        <cfquery>
           send to top
        </cfquery>
        <cfquery>
            resort everything
        <cfquery>
    </cffunction>
    

    如果你还有问题,我会尽量回答,虽然我不是一个真正的MySQL专家,而且在过去的几年里也没怎么使用过。

    推荐文章