2009-02-24 59 views
0

假設用戶正在編輯數據庫中的記錄, 在模式中您有一個名爲'lock'的字段,因此用戶不能同時編輯 同一記錄,一旦用戶結束編輯設置 lock = false允許其他用戶編輯記錄。當php會話結束時釋放數據庫鎖?

我的問題是,我可以運行一些代碼時,PHP會話結束,所以如果用戶 離開計算機,關閉瀏覽器或任何,我可以將鎖設置爲false ?. 因爲如果沒有,並糾正我,如果我錯了,記錄將保持鎖定?

我讀過從PHP手冊session_set_save_handler部分,但我不知道, 「關閉」回調這就是我需要的...

或者我需要在數據庫中添加時間戳架構並運行一個cronjob來每隔x次「解鎖」記錄 ?

謝謝!

回答

1

我不想用上面描述的方法實現鎖定,只是因爲你在第二段提到的原因。

我會做的是在表中有一個時間戳列。每當嘗試寫入該表時,都應先讀取它,然後記下它的時間戳(例如,在某個會話變量中)。在將更新後的信息寫回行中之前,我將查看時間戳並確保其時間戳與我所看到的完全相同(並在會話var中註明)。如果不是,那麼有人在我看不到的時候更新了這一行(在這種情況下,當您向用戶呈現表單並且用戶尚未將表單提交回服務器時)。

許多O/RM使用這種方法來確保一個會話不會無意中覆蓋另一個會話中所做的更改。這種方法的好處在於,您不會因放棄會話的用戶而讓「鎖」出現,而且您也不需要有cron作業來解鎖陳舊的鎖。這種方法的缺點是,只有在您嘗試更新數據庫中的記錄時纔會知道碰撞。這意味着用戶已經提交了包含數據更改的表單,並且您必須通知用戶他/她必須再次嘗試(例如,從該記錄中呈現更新/最新信息之後)。

1

我認爲你更好的與你描述的鎖定時間戳。會話關閉回調的問題是,你永遠不能確定他們被調用。例如,如果有人關閉了您的網絡服務器,或者更糟的是,會導致流程中斷。在這種情況下你也想要數據庫一致性。

0

也許這是你會在register_shutdown_function()做的事情。

+0

那麼,糾正我,如果我錯了。 從手冊「註冊的關機功能在請求完成後調用」 因此,如果我有一個edit.php函數將在頁面加載後執行並鎖定 獲得釋放,並且其他用戶可以同時進行修改 – Cesar 2009-02-24 03:29:01