DBMS 中时间戳和死锁预防方案简介2024 年 8 月 28 日 | 3 分钟阅读 DBMS 中的死锁数据库中的死锁是指某个事务T正在等待另一个事务,而另一个事务由于某个其他事务而被锁定。因此,这是数据库中的一个严重问题,所有事务互相等待,没有事务能够完成。有很多算法和方案用于避免、忽略和预防死锁。由于死锁,我们可能会面临许多问题,其中“饥饿”是其中一个问题。 饥饿当数据库中一个事务在无限时间内无法获得资源,而其他事务正常处理时,这种情况称为饥饿。当资源锁定不公平地分配给事务时,可能会发生饥饿。 数据库中的事务时间戳时间戳是一个用于唯一标识系统中每个事务的标识符。我们可以将其视为事务的开始时间。因此,每个事务按照它们在系统中提交的顺序获得其时间戳。有几种方案可以为事务分配时间戳,例如,我们可以给每个事务一个递增的数字,如 1、2、3 等。另一种方法是,我们可以为每个事务分配其当前日期和时间作为系统时钟的时间戳,这样每个事务都会获得唯一的时间戳。第二种方法被广泛用于分配时间戳。 数据库中的死锁预防方案为了预防死锁,我们有很多可用的方案。假设我们有一个项目 A,目前由事务i持有,其时间戳 ID 为TS(i)。如果事务 j 需要带有时间戳TS(j)的项目 A,那么我们必须中止其中一个事务。因此,我们将讨论两种基于时间戳的方案。
假设事务i Ti比事务j Tj年长。那么 i 的时间戳将小于j的时间戳。TS(i) < TS(j)。 在此方案中可能存在两种情况: 如果资源 A 被Tj持有,那么年长的事务Ti将等待年轻事务的完整执行,然后它将使用资源 A。 如果资源 A 被年长的事务Ti持有,那么Tj将不会等待,它将被终止。现在,年轻的事务稍后将以相同的时间戳重新启动。
假设事务i Ti比事务j Tj年长。那么 i 的时间戳将小于j的时间戳。TS(i) < TS(j)。 在此方案中可能存在两种情况: 如果资源A被Ti持有,那么年轻的事务Tj将等待年长事务的完整执行,然后它将使用资源A。 如果资源A被年轻的事务Tj持有,那么Ti将不会等待,年轻的事务将被终止。现在,年轻的事务稍后将以相同的时间戳延迟后重新启动。 因此,从这两个方案中,我们可以确定年轻的事务总是会被终止,因为它需要的处理时间较少,终止年轻事务比终止年长事务更有利。 还可以使用另一种不需要时间戳的死锁预防方案,如下所述:
这是预防死锁的朴素方法之一。在此方案中,如果一个事务需要一个资源但该资源不可用,它将立即被中止。没有事务会等待该资源,一旦被中止,它将在一段时间后延迟重新启动。因此,在此方案中,事务没有等待,所以没有死锁的可能性。但实际上,这不是一个好的解决方案,因为它会不必要地多次中止事务。
在此方案中,如果一个事务需要某个资源,并且该资源被另一个事务锁定。如果那个其他事务不等待另一个事务,而是不必要地持有资源,那么第一个事务将不得不等待资源可用;否则,它可以中止自身。 下一个主题ER 图最小化 |
我们请求您订阅我们的新闻通讯以获取最新更新。