sql-server – 什么是阻塞,它是如何发生的?
我试图在SQL Server中找到有关阻塞的一些信息,但我找不到简明的解释,说明它是什么以及它是如何发生的.你能请教导我吗?
解决方法类比有时,使用远离计算机的类比会有所帮助. 假设你有一个球和两个孩子.任何时候只有一个孩子可以接球.然而,如果其中一个孩子得到了球并且因为他分心(例如看电视)而不放手,那么另一个孩子将无法接球. 另一个孩子被阻止了该资源. 例如,如果我们将它与电视进行比较,几个孩子可以在任何一个点上看电视. 锁 如果我们转移到数据库世界,我们会发现有不同的方法来使用资源(就像我们上面的两个例子一样).我们可以执行“读取”或者我们可以执行“写入”. 当我们想要读取数据时,其他人也无法读取数据 – 就像两个人看电视一样.但是,如果我们想要写入数据,那么我们需要确保没有其他人在看它.如果他们在我们写作的时候正在阅读它们,它们会得到“脏”的读数. (意思是,他们会看到部分写出的数据,这将是无效的.) 为了确保永远不会发生这些脏读,我们有两种主要类型的锁,即Read Locks和Exclusive Locks. 读锁定 在任何给定时间,您可以从同一数据源读取多个不同的连接.但为了确保没有人在阅读时更改数据,他们会取出Read Lock. 一旦连接对一段数据具有读锁定,所有其他连接必须等到Read Lock被释放才能写入数据.但是,其他人可以在同一条数据上取出自己的Read Locks. 独家锁 如果连接想要更新/插入/删除一段数据,则必须取出独占锁.这可以防止任何其他连接也取消对数据的锁定(使锁定对该连接是唯一的). 当连接对数据具有排他锁时,不会从数据中读取其他连接.这有助于防止脏读,确保在写入数据时没有人可以读取数据. 闭塞 “阻塞”只是一个术语,意味着当另一个连接想要读取或写入时,一个连接在资源上持有锁.它并不一定意味着所有者连接不会释放它,只是它正在持有它. 将此与持有球的孩子的情况进行比较.拿着球的孩子阻止所有其他孩子拿球. 僵局 我知道你没有问过这个问题,但是只有一步才能解决僵局(而且它与阻塞非常直接相关). 当你有两个每个都有锁的连接时会发生死锁,但是他们希望彼此都有资源.在这种情况下,它就像两个孩子,每个人都有一个球,但想要另一个球. 像孩子一样,这些联系根本不愿意分享.每个连接都需要访问这两个资源才能继续.但是,它们处于永久封锁状态.在这种状态下,父(DBMS)必须进入并选择一个输家,以便其中一个子(连接)可以访问这两个资源. 一旦完成“获胜”连接,它就会释放资源,然后另一个(“丢失”)连接可以再次尝试获取这两个资源. 因此,死锁的概念是您有两个相互阻塞的资源. Here,您可以阅读有关SQL Server必须提供的所有不同类型的锁以及可能导致阻塞/死锁的不同资源的更多信息.这篇文章很旧,但它仍然适用于SQL Server 2000到2008 R2. (在SQL Server的更高版本中添加了更多类型的锁,但这将为您提供一个起点.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – SQL Server 2008 R2智能感知不起作
- SqlServer 基础知识 数据检索、查询排序语句
- SQL Server 2016里的sys.dm_exec_input_buffer的
- sql – Ruby on Rails Where子句小于大于
- sql-server – 比较整数和比较字符串的性能差异
- sql-server – 如何删除SSMS中的换行符?
- SQL Server SQL Agent服务使用教程小结
- MySQL 5.7.19安装目录下创建my.ini文件的方法
- sqlserver,mysql,db2,oracle中判断字段的值不为空
- sql-server-2008 – 使用带有快速加载目标的表锁