我应该使用cflock吗?
我想知道如果我的锁表在这种情况下(我使用ColdFusion和MySQL)是必要的:我应该使用cflock吗?
我有一个表称为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...
每个成员都可以通过删除的项目,或更改项目的等级改变他或她的列表(sendGameToTopOfList(),deleteItemFromList(),例如) 。这意味着每次对列表进行更改时,列表都必须重新排列。我写了一个名为rankList()的独立函数来处理重新排序。据“deleteGameFromList()”或“sendGameToTopOfList()后发射;它执行以下操作:
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领域是必要的,因为如果比赛被移到列表的顶部,我们将有两项排名第1,并区分他们,我用updatedAt
方案一:成员有100场比赛在他们的名单:
- 成员将项目移至顶部;在操作完成后调用rankList()。
- 虽然rankList()仍然是重新排序的项目,成员删除游戏
在正常的请求,这是罚款,该页面将不会重新加载,直到rankList()完成。但是,如果它是ajax,或者如果使用cfthread,则成员可以通过快速点击5秒来删除10个游戏。然后再次删除之后,该列表将被重新排列,因此可能无关紧要;但似乎这件事情我应该保护...
方案2:“queuedForShipping” 一些愿望清单的项目可以通过使用所谓的附加字段转成订单如果queuedForShipping为1,则rankList()函数会忽略它们。如果管理员在成员刚删除某个项目或将其移动到顶部时创建了一个货件?
您的想法值得赞赏。
附加信息:新项目会自动在插入排名最后
号CFLOCK是不会有关于MySQL如何处理事情的任何效果。
但是,您可能需要一个事务。在事务块中包装多个操作会告诉MySQL,您希望在永久存储更改之前确保所有操作都已完成。
这是假设你的多个查询在CF中产生,就像这样:
<cffunction sendToTopOfList()>
<cfquery>
send to top
</cfquery>
<cfquery>
resort everything
<cfquery>
</cffunction>
如果您正在使用的数据库服务器上的存储过程,那么(1)我可能不会太在意比赛因为在服务器进行更改时,您可能会应用行锁,并且(2)如果仍然担心,请在db服务器上使用事务。
如果你仍然有问题,我会尽力回答他们,尽管我不是MySQL专家,在过去的几年中并没有多少使用它。