2

当有人访问我的网站时,他会看到浏览量最少的页面。所有页面,包括浏览量计数器,都存储在 MYSQL 数据库中。如果查看页面,则页面浏览计数器会增加一。

如果我的网络服务器有多个线程,我现在会遇到 Racing 情况:

线程 1:用户 A 检索页面 P 的浏览量为 10
线程 2:用户 B 检索页面 P 的浏览量为 10
线程 1:页面 P 的浏览量从 10 增加到 11 并保存
线程 2:页面 P 的浏览量从 10 增加到 11 并保存

所以最后,页面被查看了两次,但 pagecounter 只增加了 1。

一种解决方案是使用 SELECT ... FOR UPDATE 锁定该行,但是,用户 B 必须等到用户 A 正在访问的记录被保存,并且许多线程都试图获取页面浏览量最少的页面,所以会有是一个延迟。

所以我的问题是:当多行被锁定时,是否有可能获得未锁定的第一行,因此线程不必相互等待?如何在 MYSQL 中做到这一点?

我更喜欢导致以下结果的解决方案:

线程1:用户A锁定页面P,浏览量为10
线程2:用户B锁定页面Q,浏览量为11(因为页面P被锁定)
线程1:页面P的浏览量从10增加到11并保存
线程2:页面Q的浏览量从11增加到12并保存

4

1 回答 1

1

我猜你正在做这样的事情:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

您的代码插入常量 11 和 30 的位置(PHP?)

更好的方法是这样做:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

然后,您不需要跨多个查询锁定行,这样您想要解决的问题就会消失。

于 2010-01-14T08:48:02.410 回答