【问题标题】:Updating a field by several users at the same time多个用户同时更新一个字段
【发布时间】:2011-12-28 09:59:41
【问题描述】:

我了解 PHP 和 MySQL 的基础知识。如果我有一个名为“Table1”的表,其中包含“id”、“name”、“count”。当用户提交消息时,它将处于待处理状态,以便版主必须批准它。因此,我的站点中会有多个版主,并且当两个或多个模块同时接受同一用户的消息时(这将更新消息表以及“Table1” - 将“count”增加 1),它会导致问题。我说的对吗?

那么,如何解决呢?

编辑1:

table1 包含注册用户的详细信息。另一个表(“Table2”)用于存储消息,该表将存储用户 ID、唯一消息 ID、消息、日期等

编辑2:

mod 会为他接受的那些消息更新消息表中的一个字段 (update table2 set approved=1 where msgid = 123)。而且,当他接受它时,将为 table1 (update table1 set count = count+1 where userid = 5) 执行更新语句。像这样,我可以消除对 count() 的调用 - select count(msgid) from table2 where userid = 5

【问题讨论】:

标签: php mysql


【解决方案1】:

发出UPDATE table1 SET count = count + 1 WHERE id = ? 时没有并发问题,请参阅我提供的可能的重复链接以获取更多关于 mysql 和并发的阅读。

【讨论】:

  • 谢谢。所以我不必明确地进行锁定或处理并发性?当前的场景是,当多个版主同时接受同一用户的多个消息时更新计数。此外,那时我的网站的浏览者将访问此计数。所以“选择”查询也会同时执行。
  • @BrianHooper 感谢您的澄清
【解决方案2】:

在 mysql 中使用 Lockunlock *tables*。

MySQL 允许客户端会话显式获取表锁,以便与其他会话协作以访问表,或防止其他会话在会话需要独占访问表的期间修改表。会话只能为自己获取或释放锁。一个会话不能获取另一个会话的锁或释放另一个会话持有的锁。

参考:http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

【讨论】:

  • 所以当表被锁定并且执行查询时,它会等待?
  • 请解释不明白你的疑问是什么?
  • 我的意思是,如果我锁定了表并执行了操作,而当时另一个用户尝试访问该锁定的表,那么该用户的查询将处于等待状态?如果我锁定一个表并执行更新然后解锁表需要多长时间?
  • 在实践中,这通常是操作中最短的部分。
  • 意思是,很快?另外,事务和锁定有什么区别?执行事务时,是否会隐式锁定表?
【解决方案3】:

您应该使用并发(多用户访问)和锁定。事实上,设计应用程序代码以考虑并发问题是必不可少的。

您可以找到Locks in mySql here 的最佳在线教程。

【讨论】:

  • 表被锁定时会发生什么?与事务相同,只是它不会回滚更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多