MySQL锁定优先级

Bry*_*eld 4 mysql concurrency

如果有一个项目在一个表上有一个读锁定一整分钟,那么其他项目仍然可以不间断地读取同一个表.

所以我可以有这个时间表

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

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

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

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

Qua*_*noi 6

但是说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)

然后.


Bry*_*eld 1

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

更改其中一项

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)