mysql - SQL中的范围锁可以共享模式获取吗

标签 mysql sql multithreading transactions

我有一个查询,例如

Select count(*) from table log where num = ?;

如果我将隔离级别设置为可序列化,那么将为 where 子句获取范围锁。

我的问题是:其他事务是否也可以获取共享模式下的范围锁来读取上面的计数或者范围锁是排他的并且所有其他事务都有在执行上述读取查询之前等待当前事务提交。

背景:我正在尝试为高流量网站实现查看计数器。为了减少对数据库的 IO,我创建了一个日志表,以便每次有一个 View 时,我只在日志表中写入一个新行。有一段时间,我(随机地)决定是否要清除日志表并将日志表中的行数添加到 View 计数表的列中。这意味着我必须小心处理交错事务。

最佳答案

以下陈述仅与 SQL Server 相关,并且是在 OP 明确表示这实际上是关于 MySQL 之前做出的,对此我一无所知。我将它留在这里,因为它(以及由此产生的讨论)可能仍然有一些用处,但它不是问题的完整、相关的答案。


SELECT 语句只会在所有隔离级别上获取共享锁(除非被表提示覆盖)。并且共享锁总是相互兼容的(参见 Lock Compatibility ),所以如果其他事务也想获取共享(范围)锁也没有问题。所以是的,您可以让任意数量的查询并行执行 SELECT COUNT(*),它们永远不会互相阻塞。

这并不意味着其他交易不必等待。特别是,DELETE 查询最终必须获得独占锁,如果 SELECT 持有共享锁,它将不得不等待。通常这不是问题,因为引擎会尽快释放锁。当它确实成为一个问题时,您将需要查看像 snapshot isolation 这样的解决方案。 ,它使用乐观并发和冲突检测而不是锁定。在该模型下,SELECT 将永远不会阻止任何其他查询(除了那些需要表锁的查询)。当然,这不是免费的;行版本控制占用磁盘空间和 I/O。

关于mysql - SQL中的范围锁可以共享模式获取吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575306/

相关文章:

c++ - 是否可以(从 C++ 中)将具有不同值的 "same"常量公开给多个 Lua 协程?

c# - 对字节数组中的每个元素求和

c - 指向非线程本地数据的线程本地指针

java - Android - php mysql。没有更新值

Mysql每行选择表5

MySQL增加值并选择结果

php - 多种方式识别用户/mysql、pdo、php

php - 从数据库中搜索字符串并获取接近单词的 php

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 徽章原因错误