Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 两阶段锁定事务的死锁_Database_Transactions_Locking_Deadlock - Fatal编程技术网

Database 两阶段锁定事务的死锁

Database 两阶段锁定事务的死锁,database,transactions,locking,deadlock,Database,Transactions,Locking,Deadlock,两阶段锁定可以在锁定阶段升级锁。但是我不知道为什么下面的例子说T1和T2是死锁。为什么读锁(x)无法升级为写锁(x) T1和T2是完全不同的过程,完全不知道彼此,因此它们应该是完全不同的 即使T2进程将“升级X上的读取锁”,它仍然不会对T1的情况产生任何影响:它仍然应该开始等待,直到X上的T2锁被释放 所以我们仍然有T1在等待T2,我们仍然有T2必须在T2试图获得Y上的锁的点开始等待T1 所以我们仍然有两个进程在等待另一个进程释放一些锁。僵局 编辑 如果引入第三个组件“Locks Manager

两阶段锁定可以在锁定阶段升级锁。但是我不知道为什么下面的例子说T1和T2是死锁。为什么读锁(x)无法升级为写锁(x)


T1和T2是完全不同的过程,完全不知道彼此,因此它们应该是完全不同的

即使T2进程将“升级X上的读取锁”,它仍然不会对T1的情况产生任何影响:它仍然应该开始等待,直到X上的T2锁被释放

所以我们仍然有T1在等待T2,我们仍然有T2必须在T2试图获得Y上的锁的点开始等待T1

所以我们仍然有两个进程在等待另一个进程释放一些锁。僵局

编辑

如果引入第三个组件“Locks Manager”,它可以同时与T1和T2通信,那么理解这个问题可能会容易一些。该锁管理器组件所经历的状态依次为“无锁”、“Y上T1持有的读锁”、“Y上T1持有的读锁和X上T2持有的读锁”


后一位首先迫使锁管理器拒绝X上T1的锁请求,前一位随后迫使锁管理器拒绝Y上T2的锁请求。

T1和T2是完全不同的进程,完全不知道彼此,因此它们应该是

即使T2进程将“升级X上的读取锁”,它仍然不会对T1的情况产生任何影响:它仍然应该开始等待,直到X上的T2锁被释放

所以我们仍然有T1在等待T2,我们仍然有T2必须在T2试图获得Y上的锁的点开始等待T1

所以我们仍然有两个进程在等待另一个进程释放一些锁。僵局

编辑

如果引入第三个组件“Locks Manager”,它可以同时与T1和T2通信,那么理解这个问题可能会容易一些。该锁管理器组件所经历的状态依次为“无锁”、“Y上T1持有的读锁”、“Y上T1持有的读锁和X上T2持有的读锁”

后一位首先迫使锁管理器在X上通过T1拒绝锁请求,前一位随后迫使锁管理器在Y上通过T2拒绝锁请求