2017-07-03 51 views
0

我有以下情况:
我有几个用户查看的项目列表,每个项目可以通过单击每个项目右侧的按钮“获取”由单个用户获取,我想知道是否检查项目的状态(项目表中的布尔型获取:true/false)足以确保一个项目不能被多个用户获取?或者是否有任何实际的方法来做到这一点在PHP/MySQL? 亲切地, 优素福。并发PHP/MYSQL

回答

1

我想知道是否检查项目的状态(获取的项目表中的布尔值:true/false)是否足以确保项目不能被多个用户获取?

取决于您如何使用它。如果你的代码确实沿此线的东西:

if (current status of item is "free") { 
    update status of item to "taken"; 
} 

那么将无法​​正常工作,因为没有了“检查”和“更新”,其中另一个进程可以穿过的,并采取项目之间的差距为自己!但是,如果你有一列,以指示该用户声称的项目,沿着这条SQL查询的东西行会的工作:

UPDATE items SET claimed_by = :current_user 
    WHERE item_id = :id AND claimed_by IS NULL 

这个查询将拒绝更新这已经声称一个项目,你可以检查该项目的claimed_by以确保您在继续之前得到它。

+0

问题是,我将不得不更新和做一些插入查询,我可以检索更新返回来检查更新是否发生?并基于这个答案,我决定是否插入查询或不。这100%会工作吗?我的意思是如果两个用户在同一时间执行更新查询? (可能吗?^^') – hereForLearing

+0

您可以查看UPDATE查询更新的行数,或者之后运行SELECT并检查“claims_by”的新值。至于并发性:数据库服务器将序列化查询。不管这些查询有多少同时运行,只有其中一个会更新“claims_by”的值,其余部分不会执行任何操作。 – duskwuff

+0

好的,先生,谢谢,我接受了你的回答。 – hereForLearing

2

在纯粹的PHP没有,作为一个PHP页面不能动态更新自己。

但是使用AJAX是可以做到的。无论是实用的还是另一个故事,因为它取决于你想检查的项目数量。即使这样,总会有一个延迟,这取决于服务器速度,用户连接速度等。

最好的办法是在用户按下获取后有一条消息说“正在检查”使用AJAX进行检查,并以先到先得的原则先到达那里,但仍然会得到该项目。

所以你的下一步将是查找AJAX(Javascript)。

另一种方法是做一个完整的页面重新加载来检查项目是否仍然可用,并预先显示一个免责声明,这将发生。由于完整的页面重新加载,这种方法仅需要比使用AJAX更长的时间。

+1

谢谢你的回答,我不希望项目从用户屏幕上消失,我想要的只是如果两个用户在同一时间点击获取只有一个将获得该项目。 – hereForLearing

+2

@saywow然后AJAX是要走的路。 –

+0

Ajax并不是我的问题的解决方案,因为正如我在评论中解释的那样,我的问题不是隐藏不可用的项目,但是如果两个用户想要在同一时间获取同一项目:双击同时获取两个检查项是否可用,在这种情况下答案是肯定的,因此两者都会获得它(这会导致错误,因为在我的数据库中它是一对多的关系),那么我该怎么做避免错误 – hereForLearing