【问题标题】:MySQL locking prioritiesMySQL 锁定优先级
【发布时间】:2010-11-09 16:19:42
【问题描述】:

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

所以我可以有这个时间表

A 使读锁定一分钟 B、C、D、E ... 以及更多仍然可以毫无问题地从该表中读取

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

是否可以禁用这种先进先出的优先级排序并赋予读锁比写锁更高的优先级?

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

【问题讨论】:

  • 我不知道这是否可能,但在一个繁忙的数据库中,我认为这会导致写锁的饥饿的可能性很高,因为如果有持续的读锁,它们将永远无法获得需要。
  • 我们在谈论MyISAM,不是吗?
  • @tloach 通常没有恒定的读锁。

标签: mysql concurrency


【解决方案1】:

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

写锁的优先级高于读锁。

这意味着T 只需等待A 完成,而UVW 将在BCD 之后排队,并且E.

实际上,读写锁是在不同的队列中持有的,后者的优先级更高。

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

A
T
B C D U V W

T 之后的所有内容都会同时执行。

来自docs

表更新的优先级高于表检索。因此,当一个锁被释放时,锁对写锁队列中的请求可用,然后对读锁队列中的请求可用。这确保了即使表有大量SELECT 活动,对表的更新也不会“饿死”。但是,如果您对一个表有很多更新,SELECT 语句会等到没有更多更新为止。

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

LOCK TABLES mytable LOW_PRIORITY WRITE

INSERT之前,别忘了做

UNLOCK TABLES

之后。

【讨论】:

  • 您能否进行异步的低优先级更新,或者仍然存在同样的问题?那么异步的低优先级呢?
【解决方案2】:

我找到了一种无需将更新发送到单独线程即可将更新设为低优先级的方法。

换一个

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多