如果有一个项目在一个表上有一个读锁定一整分钟,那么其他项目仍然可以不间断地读取同一个表.
所以我可以有这个时间表
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 次 |
最近记录: |