2010-10-25 103 views
4

我想知道如果我的鎖表在這種情況下(我使用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場比賽在他們的名單:

  1. 成員將項目移至頂部;在操作完成後調用rankList()。
  2. 雖然rankList()仍然是重新排序的項目,成員刪除遊戲

在正常的請求,這是罰款,該頁面將不會重新加載,直到rankList()完成。但是,如果它是ajax,或者如果使用cfthread,則成員可以通過快速點擊5秒來刪除10個遊戲。然後再次刪除之後,該列表將被重新排列,因此可能無關緊要;但似乎這件事情我應該保護...

方案2:「queuedForShipping」 一些願望清單的項目可以通過使用所謂的附加字段轉成訂單如果queuedForShipping爲1,則rankList()函數會忽略它們。如果管理員在成員剛刪除某個項目或將其移動到頂部時創建了一個貨件?

您的想法值得讚賞。

附加信息:新項目會自動在插入排名最後

回答

2

號CFLOCK是不會有關於MySQL如何處理事情的任何效果。

但是,您可能需要一個事務。在事務塊中包裝多個操作會告訴MySQL,您希望在永久存儲更改之前確保所有操作都已完成。

這是假設你的多個查詢在CF中產生,就像這樣:

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

如果您正在使用的數據庫服務器上的存儲過程,那麼(1)我可能不會太在意比賽因爲在服務器進行更改時,您可能會應用行鎖,並且(2)如果仍然擔心,請在db服務器上使用事務。

如果你仍然有問題,我會盡力回答他們,儘管我不是MySQL專家,在過去的幾年中並沒有多少使用它。