2011-05-11 34 views
14

我不確定如何簡潔地問這個問題,所以我會通過情境來解釋它。防止在通過PHP編輯MySQL行時同時覆蓋

用戶A決定他想通過HTML格式修改MySQL行。 同時,用戶B決定他也希望以相同的方式修改相同的MySQL行。

我們會說MySQL的行是一個文本字段,它包含文本,'Can\'t touch this'

兩個用戶沒有eachothers意向的知識。

User-A對MySQL行進行重大更改並將其保存到數據庫。 MySQL行變爲'Can\'t touch this was a popular track by the Hip-Hop artist M.C. Hammer.'

User-B對MySQL行進行小改動並將其保存到數據庫。 MySQL行變爲'Cannot touch this. Please avoid contractions.'

因爲User-B決定在User-A完成其修改之前修改MySQL行,所以修改用戶-A因User-B所做的修改而被覆蓋。

如何允許同時編輯數據庫行的腳本(如MediaWiki或任何其他維基軟件)處理此問題?

+0

AFAIK mediawiki不允許同時編輯其文檔。上次我檢查他們表明是否有人正在編輯文檔,並告訴你避免在此期間進行更改。 – Gal 2011-05-11 19:46:29

+0

幾周前,SO允許同時進行編輯,直接覆蓋以前的編輯,恕不另行通知。目前,該網站發佈了一條錯誤消息,表明其他人編輯了帖子(或提出了編輯),從而不允許我(暫時)保存編輯的消息,讓我浪費時間和精力進行無用的編輯。順便說一句,我想你在倒數第二段中交換了結果。 – 2011-05-11 20:00:14

+0

@sombe這是我以前使用的方法。然而,我發現了一個缺陷,因爲鎖定時間過長,用戶合法地進行長時間編輯會超過然後無法提交,因爲它變得自由並被其他人鎖定。 – Kairu 2011-05-12 02:39:19

回答

5

最簡單的解決方法是在可以用這種方式編輯的任何表中添加至少一個額外的字段。指示行被鎖定的東西。爲了增加實用性,您應該記錄該行何時被鎖定以及由誰進行。

解鎖已放棄記錄的定時作業也是需要的,否則有人可能只是依次編輯每條記錄,放棄編輯並鎖定整個數據庫。

在這裏發生了類似的事情。如果您正在修改某人的問題,而其他人在您離開時保存了修改內容,則會發現該問題已更改,您的修改不再有效。

+1

雖然時間鎖定還有一個缺點。在合理的情況下,有人可能會做出巨大的修改,可能需要超出鎖定期限的時間。 – Kairu 2011-05-12 02:32:52

+0

確實如此,但您可以使用ajax心跳來刷新鎖定。 – 2011-05-12 04:12:59

+0

真的!我可能會走這條路。就像我在腳本中使用Ajax一樣,它確實有它的用處。現在,只需要弄清楚如何做到這一點! – Kairu 2011-05-14 18:38:35

4

您可以使用行級鎖定來強制編輯在系列中完成(而不是同時)。這通常是您想要設計合併更改的方法,稍後可以爲您節省一些麻煩。

如果在將提交更改發送到數據庫/處理腳本的表單中使用時間戳和完整性變量,它也會有所幫助。然後你可以在寫入數據庫之前檢查它,如果沒有,給用戶一條消息,告訴他們在他/她自己之前有帖子或者變化。讓他們在提交他們自己的消息之前看到它。

+0

行級鎖定無法在基於Web的情況下工作,因爲當前請求完成時db連接通常會被切斷。該鎖將在請求期間保持不變,然後釋放並保持解鎖狀態,直到下一個請求。同時,其他用戶可以進入並編輯相同的記錄。 – 2011-05-11 20:01:10

1

我喜歡Wesley Murch方法。 您也可以允許多個用戶更改同一文檔,並在第二次提交完成時使用合併。編輯前您需要保留原始文檔。

+0

合併修訂聽起來非常密集。雖然,如果我甚至知道從哪裏開始,我肯定會嘗試。 – Kairu 2011-05-12 02:41:31

3

我知道的最簡單的方法之一是向表中添加版本字段。當您讀取記錄時,您會獲取版本字段並將其作爲隱藏字段添加到您的編輯表單中。在編輯後回發數據時,您可以獲取記錄並檢查數據庫中的版本字段是否仍與您的表單匹配。如果不是,那麼該記錄在此期間由其他人編輯(您如何處理這個取決於您)。如果匹配,則更改數據並增加版本號。換句話說,樂觀鎖定的基本實現...

+0

嗯,我沒有版本號;而是將所有修訂都存儲在一個單獨的表中,其中的時間字段既是修改時間的添加時間,也是實際頁面上次修改時間的時間字段。我正在考慮將該值作爲隱藏形式字段傳遞,並在提交表單時驗證它是否與其數據庫值匹配。 – Kairu 2011-05-12 02:37:01

+1

這確實相當於相同的功能。您還可以通過簡單的方法來檢查在此期間是否有更改(如果時間戳不匹配)。 – wimvds 2011-05-12 07:11:47