我想知道如果我的鎖表在這種情況下(我使用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()函數會忽略它們。如果管理員在成員剛刪除某個項目或將其移動到頂部時創建了一個貨件?
您的想法值得讚賞。
附加信息:新項目會自動在插入排名最後