我想知道在这种情况下是否需要锁定我的表(我正在使用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...
每个成员都可以通过删除项目或更改项目的排名来修改他或她的列表(例如, 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()之前页面不会重新加载。但如果它是ajax,或者如果使用cfthread,会员可以通过快速点击来在5秒内删除10个游戏。然后,无论如何,列表将在删除后重新排名,因此可能无关紧要;但似乎这是我应该保护的东西......
场景2: 其中一些愿望清单项目可以通过使用名为“queuedForShipping”的附加字段转变为订单。如果queuedForShipping为1,则rankList()函数忽略它们。如果管理员在成员刚删除某个项目或将其移到顶部时创建了一个货件会怎样?
您的意见表示赞赏。
其他信息:新项目会自动排在插入
的最后答案 0 :(得分:2)
没有。 CFLock不会对MySQL如何处理事情产生任何影响。
但是,您可能想要一个交易。将多个操作包装在事务块中将告诉MySQL您希望在永久存储更改之前保证所有操作都已完成。
这假设您的多个查询是在CF中生成的,如下所示:
<cffunction sendToTopOfList()>
<cfquery>
send to top
</cfquery>
<cfquery>
resort everything
<cfquery>
</cffunction>
如果您在数据库服务器上使用存储过程,那么(1)我可能不会太在意这里的竞争条件,因为您可能会在服务器进行更改时应用行锁,以及(2)查看如果您仍然担心,请在数据库服务器上使用事务。
如果你仍然有疑问,我会尝试回答这些问题,虽然我不是真正的MySQL专家,并且在过去几年里没有多大用处。