簡體   English   中英

php會話結束時釋放數據庫鎖?

[英]release a db lock when php session ends?

假設一個用戶正在編輯數據庫中的一條記錄,在模式中,您有一個名為“ lock”的字段,因此用戶不能同時編輯同一條記錄,一旦用戶結束編輯,則將lock = false設置為允許其他用戶編輯該記錄。

我的問題是,php會話結束時是否可以運行一些代碼,所以如果用戶離開計算機,關閉瀏覽器或其他任何功能,我可以將鎖定設置為false? 因為如果沒有,如果我寫錯了,請糾正我,該記錄會保持鎖定狀態嗎?

我已經從php手冊中閱讀了session_set_save_handler部分,但是我不確定'close'回調是我所需要的...

還是我需要在db模式中添加時間戳並運行cronjob來每x次“解鎖”記錄?

謝謝!

我認為您最好使用您描述的鎖定時間戳記。 會話關閉回調的問題在於,您永遠無法確定它們是否被調用。 例如,如果有人關閉您的Web服務器,或更糟的是,殺死了該進程,將會發生什么。 您還希望在這些情況下保持數據庫一致性。

我不想僅僅因為您在第二段中提到的原因而使用如上所述的方法來實現鎖定。

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

許多O / RM都使用這種方法來確保一個會話不會意外覆蓋另一會話中所做的更改。 這種方法的好處是,您不會有放棄會話的用戶留下“鎖”的機會,也不需要進行cron作業來解鎖陳舊的鎖。 這種方法的缺點是,您僅在嘗試更新數據庫中的記錄時才知道沖突。 這意味着用戶將已經提交了包含數據更改的表單,並且您將必須通知用戶他/她必須再次嘗試(例如,在顯示該記錄中的更新/最新信息之后)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM