全部课程
SQL Server的死锁说明
发布时间: 2023-04-19
事务 A 在事务 B 完成之前无法完成,但事务 B 被事务 A 阻止。此条件也称为循环依赖关系:事务 A 依赖于事务 B,事务 B 通过对事务 A 的依赖来关闭循环。
死锁中的两个事务将永远等待,除非死锁被外部进程打破。SQL Server 数据库引擎死锁监视器定期检查处于死锁状态的任务。如果监视器检测到循环依赖关系,它将选择其中一个任务作为受害者,并在出现错误的情况下终止其事务。这允许其他任务完成其事务。具有因错误而终止的事务的应用程序可以重试该事务,该事务通常在另一个死锁事务完成后完成。
死锁经常与正常阻塞混淆。当一个事务请求锁定另一个事务锁定的资源时,请求事务将等待,直到锁定被释放。默认情况下,除非设置了LOCK_TIMEOUT,否则 SQL Server 事务不会超时。请求事务被阻止,而不是死锁,因为请求事务没有执行任何操作来阻止拥有锁的事务。最终,拥有事务将完成并释放锁,然后请求事务将被授予锁定并继续。死锁几乎可以立即解决,而阻塞理论上可以无限期地持续存在。僵局有时被称为致命的拥抱。
死锁是可能发生在具有多个线程的任何系统上的情况,而不仅仅是在关系数据库管理系统上,并且可能发生在数据库对象上的锁以外的资源上。例如,多线程操作系统中的线程可能会获取一个或多个资源,例如内存块。如果要获取的资源当前由另一个线程拥有,则第一个线程可能必须等待拥有该线程释放目标资源。据说等待线程依赖于该特定资源的拥有线程。在 SQL Server 数据库引擎实例中,会话在获取非数据库资源(如内存或线程)时可能会死锁。
上一篇: MapReduce框架采用什么架构
下一篇: URL组成格式是什么