当前位置: 首页 > 面试题库 >

如何避免数据库死锁?

上官琦
2023-03-14
问题内容

某些数据库功能(例如SELECT ... FOR UPDATEON DELETE CASCADE)很容易受到死锁的影响,因为数据库未指定将使用哪种锁定顺序。我发现有两次
讨论暗示此行为不是SQL标准指定的,更不用说具体的实现了。因此,我在假设我们无法控制锁定顺序的情况下进行操作(至少,这样做并不明显)。

如果我们不能依赖锁定顺序,应该如何避免数据库死锁?

如果我们不应该避免僵局(您将不得不非常努力地说服我),那么我们应该怎么做?

这个问题与数据库无关,所以请不要问我正在使用哪个数据库


问题答案:

明智的做法是几年,我正在修改公认的答案,以声明无法防止数据库死锁:

锁定顺序由特定于实现的执行顺序确定。答案进一步说,没有确定的方法可以防止死锁。在命令式编程中,我们可以通过以相同的顺序获取锁来防止死锁,但是似乎在声明性系统中,当检测到死锁时,我们必须通过重试操作来解决死锁。

此外,我认为,由于数据库执行计划会在其生命周期内发生变化,因此从技术上讲,不可能防止死锁。

如果您有幸能够分解数据库操作以一次仅与一个表进行交互(这种情况并非总是可能的),那么您将不得不在性能低下和出现死锁的可能性之间进行选择。选择你的毒药。



 类似资料:
  • 主要内容:示例资源分配图是系统状态的图形表示。 顾名思义,资源分配图是关于持有一些资源或等待某些资源的所有进程的完整信息。 它还包含有关所有资源的所有实例的信息,无论这些资源是否可用或正在被进程使用。 在资源分配图中,进程由圆形表示,而资源由矩形表示。 我们来详细看看顶点和边的类型。 顶点主要有两种类型,资源和过程。 它们中的每一个将以不同的形状表示。 Circle代表进程,而矩形代表资源。 一个资源可以有多个

  • 在避免死锁的情况下,如果系统的结果状态不会导致系统中的死锁,那么将会授予对任何资源的请求。系统的状态将持续检查安全和不安全的状态。 为了避免死锁,进程必须告诉OS,进程可以请求完成其执行的最大资源数量。 最简单和最有用的方法指出,流程应声明它可能需要的每种类型的最大资源数量。 死锁避免算法检查资源分配,以便永远不会有循环等待条件。 安全和不安全的状态 系统的资源分配状态可以由可用资源和已分配资源的

  • 本文向大家介绍什么是线程死锁?如何避免死锁?相关面试题,主要包含被问及什么是线程死锁?如何避免死锁?时的应答技巧和注意事项,需要的朋友参考一下 认识线程死锁 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

  • 我已经在Jenkins安装上配置了两个多分支项目(来自GitHub)。目前遗嘱执行人的数量是四个。 有时,当有很多分支要构建时,它最终会出现所有执行器都在等待免费执行器而什么都没有发生的情况。 你通常如何避免这种情况?当然,人们不能在一台机器上配置一百万个执行器来确保这种情况永远不会发生。 我现在有四个执行者试图构建,他们都在等待对方: 另一个问题是,这是如何/为什么可能的?他们没有实施任何机制来

  • 我目前正在开发一个Android应用程序,我使用Firebase(实时功能)作为后端服务。此外,我开发了这个功能,如下所示。 扩展代码工作得很好,它检查现有数据并显示Toast消息,但在数据仍进入数据库后,我想消除重复数据。

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。