MySQL 读锁与写锁

MySQL Read vs Write Lock

我想让客户端会话锁定 table,以便它可以继续读取和写入 table。同时其他客户端会话应该只能从 table 中读取。一旦锁被移除,那么所有客户端会话都应该被允许读取和写入 table。此外,一旦锁定被移除,所有试图在 table 被锁定时写入的客户端会话都应该执行。我不希望在锁定期间尝试插入时出现任何错误。

我知道读锁不起作用,因为创建锁的客户端会话在锁存在时无法写入 table。写锁也不起作用,因为其他客户端会话无法从 table 中读取。我有什么办法可以做到这一点吗?

由于您在问题中陈述的原因,您不能使用 LOCK TABLES 语句使用 table 锁。

您可以通过在 table:

的所有行上创建行锁来实现
SELECT COUNT(*) FROM mytable FOR UPDATE;

行锁会阻止任何其他会话写入,直到您提交事务,但只要它们不尝试使用锁定读取查询,它们就可以读取。同时,您可以读取或写入 table,因为您已经锁定了所有行。

另一种解决方案是获取全局锁,但不要使用LOCK TABLES。我编写的系统中,所有参与的客户端都需要在写入 table 之前使用 GET_LOCK() function 获取锁。但如果他们只需要阅读,他们就会跳过对该锁的请求。这可行,但需要所有客户端包含支持相同访问策略的代码。