首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可序列化的隔离级别会导致死锁和并发问题?

为什么可序列化的隔离级别会导致死锁和并发问题?
EN

Stack Overflow用户
提问于 2016-08-19 00:52:47
回答 1查看 1.9K关注 0票数 1

我知道这样一种理论,即带有范围锁的读取&写锁在事务的持续时间内保持在可序列化的隔离级别上。我可以理解有人说“在所有条件相同的情况下,可序列化的隔离可能,但不一定会导致并发性低于任何其他隔离级别”。但是,按照所有博客/文档的说法,更低的并发性和更高的死锁似乎是必然的。我正试图理解为什么在我的特殊情况下,在实际意义上应该如此。以下是我的一些问题

  1. 如果不同的连接没有访问同一组记录,可序列化的隔离级别是否会导致较低的并发性?我假设一个“经过精细调整的”OLTP系统,其中每个查询都是一个“点查询”,只返回几行,并且优化器提出了很好的计划。我也在考虑数据页,而不是索引页。
  2. 为什么死锁会增加?这是由于对索引页的更新吗?但是,这种情况可以发生在任何隔离级别,而不是快照隔离。那么为什么要单独列出可序列化的隔离级别呢?

我当然会接受这样的回答:“根据用户输入,你永远不知道你的执行计划何时会变坏。你设置一个比所需的隔离级别更高的隔离级别,从而使糟糕的情况变得更糟。所以,设置最高的隔离级别,这对你来说是最有效的。”

EN

回答 1

Stack Overflow用户

发布于 2016-08-19 05:04:47

简单的回答是,在从read uncommitted一直到serializable的过程中,您最终会取出更多的不同类型的锁。在某种程度上,这是有意义的;否则,数据库引擎如何能够提供以下保证?

在当前事务完成之前,其他事务不能插入键值在当前事务中任何语句读取的键范围内的新行。

在进一步的文档中,它直接指出范围锁被取出。因此,如果您执行类似于select * from dbo.yourTable where ID between 1 and 50的操作,并且当前该表中只有10行(例如ID1-10),则应用程序将无法:

  • 插入ID的任何数据11-50
  • 删除/更新1-10中的任何一个

如果你需要它你就需要它。但是,要知道您正在进入什么;被放置的共享范围锁与许多内容不兼容(读“会导致阻塞”)。有关详细信息,请参阅锁相容性矩阵

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39029573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档