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的更高版本中添加了更多类型的锁,但这将为您提供一个起点.)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...