MySQL锁定优先级

时间:2010-11-09 16:19:43

标签: mysql concurrency

如果某个项目在一张桌子上有一分钟的读锁定,那么其他项目仍然可以不间断地读取同一个表格。

所以我可以有这个时间表

A读取锁定一分钟 B,C,D,E ......以及还有更多内容仍然可以从该表中读取而没有问题

但是说T要求锁。 T必须等待..似乎U V W都在等待T ,,即使U V W只是要求读锁定而T还没有实际获得它的锁定。

是否可以禁用此优先排序优先级并使读锁优先于写锁?

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

2 个答案:

答案 0 :(得分:6)

  

但是说T要求写锁定。 T必须等待..似乎U V W都在等待T ,,即使U V W只是要求读锁而T还没有实际获得锁定

写锁的优先级高于读锁。

这意味着T只需要等待A完成,UVW将排在{{1}之后},BCD

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

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

E

A T B C D U V W 同时执行后的所有内容。

来自docs

  

表更新的优先级高于表检索。因此,当释放锁定时,锁定对写入锁定队列中的请求可用,然后对读取锁定队列中的请求可用。这可确保即使表格中存在大量T活动,对表格的更新也不会“缺乏”。但是,如果表有很多更新,SELECT语句将等待,直到没有更新。

如果您希望写入事务等到没有挂起读取,则应明确发出

SELECT
LOCK TABLES mytable LOW_PRIORITY WRITE 之前

,不要忘记做

INSERT

之后。

答案 1 :(得分: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;