我在不同的Web應用程序中看到過一個功能,包括Wordpress(不確定?),它警告用戶,如果他/她從數據庫中打開文章/帖子/頁面/否則會同時編輯相同的數據。防止兩個用戶編輯相同的數據
我想在我自己的應用程序中實現相同的功能,我已經給了這個想法。下面的例子是如何做到這一點的良好做法?
它去有點像這樣:
1)User A
進入編輯頁面的神祕物品X.數據庫表Events
進行查詢,以確保沒有其他人編輯同一個頁面的那一刻,沒有人在那。然後隨機生成令牌並將其插入名爲Events
的數據庫表中。
1)User B
也希望是進行更新文章X.現在,因爲我們User A
已經被編輯的文章中,Events
查詢表,看起來像這樣:
| timestamp | owner | Origin | token |
------------------------------------------------------------
| 1273226321 | User A | article-x | uniqueid## |
2)時間戳是被檢查。如果它是有效的和小於說百秒老,會出現一條消息,並且用戶不能對所請求的第十條任何改變:如果用戶A決定繼續並保存他的更改,令牌
Warning: User A is currently working with this article. In the meantime, editing cannot be done. Please do something else with your life.
3)與所有其他數據一起發佈以更新數據庫,並切換查詢以刪除具有標記uniqueid##
的行。如果他決定採取其他措施而不是進行修改,那麼文章X仍然可以在100秒內編輯,以便在012秒內完成編輯。User B
讓我知道您對這種方法的看法!
祝大家週末愉快!
不錯,100秒的延遲只是一個例子,所以這對於一篇文章的複雜更新可能有點不切實際。你會怎麼做? – Industrial 2010-05-08 11:49:44
把100秒作爲「僅僅是一個例子」並不重要。重點是:不存在任何單一的這樣的時間間隔,你可以放心地說:「經過這段時間之後,我可以肯定地知道該編輯不再真的在編輯這篇文章」(並且將把文章釋放在內合理的時間來編輯後續的編輯誰想要做一些真正的工作)。 你想做的事情與「等待用戶輸入時事務處於等待狀態時保持掛起狀態」非常相似。這被認爲是一種非常糟糕的設計技術。 – 2010-05-08 12:04:18
Seb提出了「鎖定中斷」的可能性,也就是說,在沒有明確徵得A的同意的情況下,B有可能否決A的鎖定。 你可以這樣做,但在某些情況下,事情可能會變成競爭用戶之間的拳擊比賽。允許第三方在沒有通知我的情況下「分手」我所做的事情,也不完全是最有禮貌的解決方案。 – 2010-05-08 12:28:33