如果有一个项目在一个表上有一个读锁定一整分钟,那么其他项目仍然可以不间断地读取同一个表.
所以我可以有这个时间表
A对一分钟B,C,D,E ......进行读锁定,还有更多内容仍然可以从该表读取而没有问题
但是说T要求写锁定.T必须等待..似乎UVW都在等待T ,,即使UVW只是要求读锁定而T还没有实际获得它的锁定.
是否可以禁用此先入先出优先级并使读锁优先于写锁?
编辑:也许有一些低优先级的开关,我可以把我的更新命令?我希望它是同步的(因此线程可以等到它完成,即使它是低优先级).
但是说T要求写锁定.T必须等待..似乎UVW都在等待T ,,即使UVW只是要求读锁定而T还没有实际获得它的锁定
写锁定的优先级高于读锁定.
这意味着,T只需要等待A完成,并且U,V并且W将在后面排队B,C,D,和E.
实际上,读取和写入锁定保存在单独的队列中,后者具有更高的优先级.
在您的情况下,请求将按以下顺序执行:
A
T
B C D U V W
Run Code Online (Sandbox Code Playgroud)
,T并发执行后的一切.
来自文档:
表更新的优先级高于表检索.因此,当释放锁定时,锁定对写入锁定队列中的请求可用,然后对读取锁定队列中的请求可用.这可确保即使表中存在大量
SELECT活动,对表的更新也不会"缺乏" .但是,如果您有一个表的许多更新,SELECT语句将等待,直到没有更新.
如果您希望写入事务等到没有挂起读取,则应明确发出
LOCK TABLES mytable LOW_PRIORITY WRITE
Run Code Online (Sandbox Code Playgroud)
之前INSERT,不要忘记做
UNLOCK TABLES
Run Code Online (Sandbox Code Playgroud)
然后.
我找到了一种使更新优先级较低的方法,而无需将它们发送到单独的线程。
更改其中一项
UPDATE bob ...
INSERT INTO bob ...
DELETE FROM bob;
LOCK TABLE bob WRITE;
Run Code Online (Sandbox Code Playgroud)
到
UPDATE LOW_PRIORITY bob ...
INSERT LOW_PRIORITY INTO bob ...
DELETE LOW_PRIORITY FROM bob;
LOCK TABLE bob LOW_PRIORITY WRITE;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |