截断MEMORY表,并锁定

时间:2009-09-21 22:30:22

标签: mysql locking

我使用1列内存表来跟踪数据库中各种项目的视图。每个view = INSERT查询到内存表中。每10分钟,我想计算()每个项目的行,并将更改提交给DB。

问题是......如果我运行将获得所有项目列表的查询,例如

SELECT COUNT(*) AS period_views, `item_id` FROM `-views` GROUP BY `item_id` ORDER BY `item_id`

然后为每一行运行更新查询以添加该时间段内的视图量,然后截断该表。这个操作可能需要几秒钟......在那几秒钟内,该表中会有其他INSERTS,它没有进入原始计数。一旦该命令执行,它们也会被截断吗?或者表是否会被锁定,直到整个操作完成,并且添加了新的INSERT?

1 个答案:

答案 0 :(得分:0)

MySQL不会自动锁定表格,并且在获取计数和执行截断之间可能会丢失一些记录。所以有两个解决方案向我跳出来:

1)使用表锁来防止更新内存表 - 这取决于应用程序的性质,这意味着您在更新时所有客户端可能会冻结几秒钟,这可能没问题。

2)添加第二列以跟踪您当前正在更新的记录...

ALTER TABLE `-views` ADD work_in_progress TINYINT NOT NULL DEFAULT 0;

然后当你想要处理那些记录时

UPDATE `-views` SET work_in_progress = 1;
SELECT COUNT(*) AS period_views, `item_id` FROM `-views` WHERE work_in_progress GROUP BY `item_id` ORDER BY `item_id`;
# [ perform updates as necessary ]
DELETE FROM `-views` WHERE work_in_progress;

此实施将保证您不会删除在更新时添加的任何-views

而FWIW,-views是表格的糟糕的名称!