如果某个项目在一张桌子上有一分钟的读锁定,那么其他项目仍然可以不间断地读取同一个表格。
所以我可以有这个时间表
A读取锁定一分钟 B,C,D,E ......以及还有更多内容仍然可以从该表中读取而没有问题
但是说T要求写锁。 T必须等待..似乎U V W都在等待T ,,即使U V W只是要求读锁定而T还没有实际获得它的锁定。
是否可以禁用此优先排序优先级并使读锁优先于写锁?
编辑:也许我可以在更新命令上放置某种低优先级的开关?我希望它是同步的(因此线程可以等到它完成,即使它是低优先级)。
答案 0 :(得分:6)
但是说T要求写锁定。 T必须等待..似乎U V W都在等待T ,,即使U V W只是要求读锁而T还没有实际获得锁定
写锁的优先级高于读锁。
这意味着T
只需要等待A
完成,U
,V
和W
将排在{{1}之后},B
,C
和D
。
实际上,读取和写入锁定保存在单独的队列中,后者具有更高的优先级。
在您的情况下,请求将按以下顺序执行:
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;