php会话结束时释放数据库锁?

时间:2009-02-24 00:15:40

标签: php database session locking

假设用户正在编辑数据库中的记录, 在架构中,您有一个名为“lock”的字段,因此用户无法进行编辑 一旦用户结束您设置的编辑,同时记录相同的记录 lock = false以允许其他用户编辑记录。

我的问题是,我可以在php会话结束时运行一些代码,所以如果是用户 离开电脑,关闭浏览器或其他什么,我可以将锁设置为假? 因为如果没有,如果我错了,请纠正我,记录会保持锁定状态吗?

我已经阅读了php手册中的session_set_save_handler部分,但我不确定 “关闭”回调就是我需要的......

或者我是否需要在db模式中添加时间戳并运行cronjob来“解锁”记录 每隔x次?

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为你对你描述的锁定时间戳更好。会话关闭回调的问题在于您永远无法确定它们是否被调用。例如,如果有人关闭您的网络服务器会发生什么,或者更糟糕的是,会导致流程终止。在这些情况下,您也希望数据库一致。

答案 1 :(得分:1)

我不想使用你上面描述的方法实现锁定,只是因为你在第二段中提到的原因。

我要做的是在表格中添加一个时间戳列。每当尝试写入该表时,应首先读取它,然后记录其时间戳(例如,在某处的会话变量中)。在将更新的信息写回行之前,我将查看时间戳并确保其时间戳与我看到的时间戳完全相同(并在会话var中注明)。如果不是,有人在我不看的时候更新了这行(在这种情况下,当你向用户提交表单时,用户还没有将表单提交回服务器)。

这种方法是许多O / RM用来确保一个会话不会无意中覆盖另一个会话中所做的更改的方法。这种方法的好处在于,您不会被放弃会话的用户留下“锁定”的机会,并且您不需要使用cron作业来解锁过时的锁。这种方法的缺点是,您只会在尝试更新数据库中的记录时知道冲突。这意味着用户已经提交了包含数据更改的表单,您必须通知用户他/她必须再次尝试(例如,在显示该记录的更新/最新信息之后)。

答案 2 :(得分:0)

也许你会在register_shutdown_function()中做这件事。