2010-11-09 74 views
4

如果有一个项目在整个分钟内在表上有读取锁定,则其他项目仍可以不间断地读取同一个表。MySQL锁定优先级

所以我可以有这个时间表

一个使一分钟读锁 B,C,d,E ...以及更多从该表也看没有问题

但说T要求锁。 T不得不等待......看起来U V W都在等待T,即使U V W只是要求读锁,而T实际上还没有获得锁。

是否有可能禁用此先进先出排序的优先顺序并给读锁比写锁更高的优先级?

编辑:也许有某种低优先级的开关,我可以把我的更新命令?我希望它是同步的(因此线程可以等待完成,即使它是低优先级)。

+0

我不知道这是可能的,但在繁忙的数据库中,我认为这将导致饥饿写一个高一个机会因为如果需要不断读取锁定,永远不会获得锁定。 – tloach 2010-11-09 16:25:50

+3

我们在谈论'MyISAM',不是吗? – Quassnoi 2010-11-09 16:31:33

+0

@tloach通常不会有常量读锁。 – 2010-11-09 18:05:05

回答

1

我发现了一种方法来更新低优先级,而无需将它们发送到单独的线程。

变化

UPDATE bob ... 
INSERT INTO bob ... 
DELETE FROM bob; 
LOCK TABLE bob WRITE; 

UPDATE LOW_PRIORITY bob ... 
INSERT LOW_PRIORITY INTO bob ... 
DELETE LOW_PRIORITY FROM bob; 
LOCK TABLE bob LOW_PRIORITY WRITE; 
6

但是说T要求写入锁定。 T公司等..这似乎UVW都等着对于T ,,即使UVW只是要求读锁和T并未实际获得性它锁又

写锁定分配比读锁更高的优先级。

这意味着T将只需要等待A来完成,而UVW会后BCDE排队。

实际上,读写锁定保存在单独的队列中,后者具有更高的优先级。

在你的情况下,请求将按照以下顺序来执行:

A 
T 
B C D U V W 

T后一切都被同时执行。

docs

表的更新比表检索给予更高的优先级。因此,当释放一个锁时,该锁可用于写入锁定队列中的请求,然后可用于读取锁定队列中的请求。这可以确保即使表中存在重要的SELECT活动,对表的更新也不会“饿死”。但是,如果您有多个表的更新,则SELECT语句会一直等到没有更新时为止。

如果你想在写作交易要等到没有未决的读取,你应该明确地发出

LOCK TABLES mytable LOW_PRIORITY WRITE 

之前INSERT,不要忘记做

UNLOCK TABLES 

之后。

+0

你可以做一个较低优先级的更新,它是*不是异步的,还是会有同样的问题?那么*是异步的低优先级呢? – 2010-11-09 18:09:16