MySQL上的并发计数器

时间:2015-05-30 04:20:50

标签: php mysql concurrency transactions counter

我当前的设置是一个InnoDB表,它保存我的应用程序所需的计数器。每行由一个键标识,并具有一个计数器值(使用的最后一个值)。

PHP应用程序正在使用它,它需要不同实体的唯一标识符。数字上必须没有重复,并且由于计数器本身可以重置,因此无法对结束列进行约束。

在事务结束时并不总是检索该数字,并且使用select for update或甚至更新并选择,资源将被锁定,直到提交事务为止。有些事务非常繁重(此时重构不是一个选项),并且他们正在创建锁定等待超时以到达此资源。

使用MySQL只能实现此计数器的最佳解决方案。

1 个答案:

答案 0 :(得分:1)

在将我的计数器移到Redis之前,我使用了这个解决方案一段时间。

UPDATE `counters` SET `children_count` = (SELECT (@a:= `children_count` + 1))
WHERE `node_id` = 1'

然后你用

获得值
SELECT @a AS `children_count`

该值在当前会话中可用。