MySQL由多个用户更新同一行,如counter

时间:2014-06-03 14:19:04

标签: php mysql

我试图为用户帖子增加一个类似的计数器。我的MySQL表中的一个帖子有一个字段,显示这个特定帖子有多少喜欢。现在,如果多个用户同时喜欢同一个帖子,会发生什么?我认为这会导致冲突或不正确增加?如何避免这种情况,我是否需要锁定行或我有哪些选项?

我的查询看起来像这样:

UPDATE posts
    SET likes = likes + 1,
    WHERE id = some_value

当用户不喜欢帖子时,这应该减少 - >喜欢-1

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

这是一个足够简单的查询来运行:

UPDATE mytable SET mycolumn = mycolumn + 1;

这样即使你有多个人同时喜欢这些查询也不会在同一时间运行,所以你最终会得到正确的数字。

这些查询在几分之一秒内运行,所以你不必担心多个用户点击它们,除非你有数百万用户,然后你会遇到很多与查询有关的问题

答案 1 :(得分:3)

同时喜欢同一篇文章的人只会在长而复杂的查询中引起问题。

这对于增量来说应该足够了,否则整个SQL将变得无用。

UPDATE posts
SET likes = likes + 1
WHERE id = some_value

您可以始终以编程方式运行此查询两次,看看会发生什么。我可以保证从0到2。

someTableAdapter.LikePost(postID);
someTableAdapter.LikePost(postID);

答案 2 :(得分:2)

你所描述的是一种竞争条件(如同比赛,比赛结束。有点像和两个人一起演奏音乐椅,但只有一把椅子)。我相信如果您研究交易,您可能能够实现您的代码并具有伪并发的喜欢。这是MySQL手册的链接。

MySQL 5.1 Manual: Transactional and Locking Statements

YouTube: MySQL Transactions


" MySQL使用行级锁定 InnoDB 表来支持多个会话同时写入 ,使它们适用于多用户,高度并发和OLTP应用程序

MySQL对 MyISAM MEMORY MERGE 表使用表级锁定,仅允许一个会话一次更新这些表,使它们更适合只读,大多数读取或单用户应用程序。 "

MySQL Manual, 8.7.1: Internal Locking Methods


但是,如果事务太多,请确保至少使用InnoDB存储引擎,如果您正在使用具有适当隔离级别的ACID兼容数据库,那么您应该没问题。

有很多很好的参考资料,但希望我能指出你正确的方向。

安东尼