我试图为用户帖子增加一个类似的计数器。我的MySQL表中的一个帖子有一个字段,显示这个特定帖子有多少喜欢。现在,如果多个用户同时喜欢同一个帖子,会发生什么?我认为这会导致冲突或不正确增加?如何避免这种情况,我是否需要锁定行或我有哪些选项?
我的查询看起来像这样:
UPDATE posts
SET likes = likes + 1,
WHERE id = some_value
当用户不喜欢帖子时,这应该减少 - >喜欢-1
感谢您的帮助!
答案 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
" MySQL使用行级锁定 InnoDB 表来支持多个会话同时写入 ,使它们适用于多用户,高度并发和OLTP应用程序。
MySQL对 MyISAM , MEMORY 和 MERGE 表使用表级锁定,仅允许一个会话一次更新这些表,使它们更适合只读,大多数读取或单用户应用程序。 "
MySQL Manual, 8.7.1: Internal Locking Methods
但是,如果事务太多,请确保至少使用InnoDB存储引擎,如果您正在使用具有适当隔离级别的ACID兼容数据库,那么您应该没问题。
有很多很好的参考资料,但希望我能指出你正确的方向。
安东尼