当有人访问我的网站时,他会看到浏览量最少的页面。所有页面,包括浏览量计数器,都存储在 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并保存