等待死亡和创伤等待算法之间有什么区别?

这两种死锁预防技术似乎都在做同样的事情:回滚旧进程.

两者之间有什么区别?

请提供一个合适的例子来对比这两种算法.

推荐答案

Wait-Die scheme

这是一种防止死锁的non-preemptive技术. 当事务Tn请求Tk当前持有的数据项时, 仅当Tn的时间戳小于Tk的时间戳时,才允许Tn等待 (即Tnolder比Tk),否则Tn被杀死("die").

在该方案中,如果事务请求锁定资源(数据项), 它已经由另一个事务使用冲突锁持有,则可能出现以下两种可能性之一:

  1. Timestamp(Tn) < Timestamp(Tk) −

  2. Timestamp(Tn) > Timestamp(Tk)

该方案允许较老的事务"等待",但会杀死较年轻的事务("死亡").

实例

假设事务T5、T10、T15分别具有时间戳5、10和15.

如果T 5请求由T 10持有的数据项,则T 5将"等待".

如果T15请求由T10保存的数据项,则T15将被终止("die").

Wound-Wait scheme

这是一种防止死锁的技术.

在该方案中,如果事务请求锁定资源(数据项), 它已经被另一个事务用冲突的锁持有,则可能会出现以下两种可能性之一:

  1. Timestamp(Tn) < Timestamp(Tk), 然后,Tn迫使Tk被杀死,即Tn"−"Tk. Tk is restarted later with a random delay but with the same timestamp(k).

  2. Timestamp(Tn) > Timestamp(Tk),

该方案允许请求锁定的较年轻事务在较老事务已持有锁的情况下"等待",但如果较老事务请求锁定较年轻事务已持有的项目,则强制较年轻事务暂停("关闭").

实例

再次假设事务T5、T10、T15分别具有时间戳5、10和15.

如果T 5请求由T 10持有数据项, 那么数据项将从T10被抢占,并且T10将被暂停.("伤员")

如果T15请求由T10持有的数据项,则T15将"等待".

摘要

在这两种情况下,只有以later时间戳进入系统的事务(即较年轻的事务)可能被终止并重新启动.

Database相关问答推荐

从仅连接器电源查询制作图表

在保持抽象的同时将格式化文本存储在数据库中

为什么引用 SQLite rowid 会导致外键不匹配?

创建数据库索引有哪些最佳实践和经验法则?

分布式数据库管理系统 (DDBMS) 中的水平与垂直碎片

su postgres:Sorry?

便携式(PHPPass)密码哈希.我应该使用它们吗?

Android - SQLite 数据库存储在哪里?

如何验证 SQLAlchemy ORM 中的列数据类型?

Zend 框架 - 为什么我应该使用数据映射器/Db_Table_Row?

通过删除执行计划中的排序运算符来优化 SQL 查询

我应该为我创建的新创建的 PostgreSQL 模式使用什么正确的文件扩展名?

Mysql用户创建脚本

Slick 3.0 在数据库驱动程序级别是reactive/asynchronous的吗?对于哪些数据库?

添加具有初始(但不是默认)值的新列的最佳方法?

PostgreSQL 哈希索引

TransactionScope 是如何工作的?

如何在多列上创建 FULLTEXT 索引?

如何将sqlite表从磁盘数据库复制到python中的内存数据库?

以可能的数据丢失为代价提高 PostgreSQL 写入速度?