dbms 10
dbms 10
Deadlock
In a multi-process system, deadlock is an unwanted situation that arises in a shared
resource environment, where a process indefinitely waits for a resource that is held by
another process.
For example, assume a set of transactions {T , T , T , ...,T }. T needs a resource X to complete
0 1 2 n 0
its task. Resource X is held by T , and T is waiting for a resource Y, which is held by T . T is
1 1 2 2
waiting for resource Z, which is held by T . Thus, all the processes wait for each other to
0
release resources. In this situation, none of the processes can finish their task. This situation
is known as a deadlock.
Deadlocks are not healthy for a system. In case a system is stuck in a deadlock, the
transactions involved in the deadlock are either rolled back or restarted.
Deadlock Prevention
To prevent any deadlock situation in the system, the DBMS aggressively inspects all the
operations, where transactions are about to execute. The DBMS inspects the operations and
analyzes if they can create a deadlock situation. If it finds that a deadlock situation might
occur, then that transaction is never allowed to be executed.
There are deadlock prevention schemes that use timestamp ordering mechanism of
transactions in order to predetermine a deadlock situation.
Wait-Die Scheme
In this scheme, if a transaction requests to lock a resource (data item), which is already held
with a conflicting lock by another transaction, then one of the two possibilities may occur −
If TS(T ) < TS(T ) − that is T , which is requesting a conflicting lock, is older than T −
i j i j
If TS(T ) > TS(t ) − that is T is younger than T − then T dies. T is restarted later with a
i j i j i i
This scheme, allows the younger transaction to wait; but when an older transaction requests
an item held by a younger one, the older transaction forces the younger one to abort and
release the item.
In both the cases, the transaction that enters the system at a later stage is aborted.
Deadlock Avoidance
Aborting a transaction is not always a practical approach. Instead, deadlock avoidance
mechanisms can be used to detect any deadlock situation in advance. Methods like "wait-
for graph" are available but they are suitable for only those systems where transactions are
lightweight having fewer instances of resource. In a bulky system, deadlock prevention
techniques may work well.
Wait-for Graph
This is a simple method available to track if any deadlock situation may arise. For each
transaction entering into the system, a node is created. When a transaction T requests for a i
lock on an item, say X, which is held by some other transaction T , a directed edge is created
j
from T to T . If T releases item X, the edge between them is dropped and T locks the data
i j j i
item.
The system maintains this wait-for graph for every transaction waiting for some data items
held by others. The system keeps checking if there's any cycle in the graph.
What is deadlock
In a database management system (DBMS), a deadlock occurs when two or more
transactions are waiting for each other to release resources, such as locks on database
objects, that they need to complete their operations. As a result, none of the transactions
can proceed, leading to a situation where they are stuck or “deadlocked.”
Deadlocks can happen in multi-user environments when two or more transactions are
running concurrently and try to access the same data in a different order. When this
happens, one transaction may hold a lock on a resource that another transaction needs,
while the second transaction may hold a lock on a resource that the first transaction needs.
Both transactions are then blocked, waiting for the other to release the resource they need.
DBMSs often use various techniques to detect and resolve deadlocks automatically. These
techniques include timeout mechanisms, where a transaction is forced to release its locks
after a certain period of time, and deadlock detection algorithms, which periodically scan
the transaction log for deadlock cycles and then choose a transaction to abort to resolve the
deadlock.
It is also possible to prevent deadlocks by careful design of transactions, such as always
acquiring locks in the same order or releasing locks as soon as possible. Proper design of the
database schema and application can also help to minimize the likelihood of deadlocks
In a database, a deadlock is an unwanted situation in which two or more transactions are
waiting indefinitely for one another to give up locks. Deadlock is said to be one of the most
feared complications in DBMS as it brings the whole system to a Halt.
Example – let us understand the concept of Deadlock with an example :
Suppose, Transaction T1 holds a lock on some rows in the Students table and needs to
update some rows in the Grades table. Simultaneously, Transaction T2 holds locks on those
very rows (Which T1 needs to update) in the Grades table but needs to update the rows in
the Student table held by Transaction T1.
Now, the main problem arises. Transaction T1 will wait for transaction T2 to give up the
lock, and similarly, transaction T2 will wait for transaction T1 to give up the lock. As a
consequence, All activity comes to a halt and remains at a standstill forever unless the
DBMS detects the deadlock and aborts one of the transactions.
Deadlock in DBMS
Deadlock Avoidance:
When a database is stuck in a deadlock, It is always better to avoid the deadlock rather than
restarting or aborting the database. The deadlock avoidance method is suitable for smaller
databases whereas the deadlock prevention method is suitable for larger databases.
One method of avoiding deadlock is using application-consistent logic. In the above-given
example, Transactions that access Students and Grades should always access the tables in
the same order. In this way, in the scenario described above, Transaction T1 simply waits for
transaction T2 to release the lock on Grades before it begins. When transaction T2 releases
the lock, Transaction T1 can proceed freely.
Another method for avoiding deadlock is to apply both the row-level locking mechanism and
the READ COMMITTED isolation level. However, It does not guarantee to remove deadlocks
completely.
Deadlxock Detection:
When a transaction waits indefinitely to obtain a lock, The database management system
should detect whether the transaction is involved in a deadlock or not.
Wait-for-graph is one of the methods for detecting the deadlock situation. This method is
suitable for smaller databases. In this method, a graph is drawn based on the transaction
and its lock on the resource. If the graph created has a closed loop or a cycle, then there is a
deadlock.
For the above-mentioned scenario, the Wait-For graph is drawn below:
Deadlock prevention:
For a large database, the deadlock prevention method is suitable. A deadlock can be
prevented if the resources are allocated in such a way that a deadlock never occurs. The
DBMS analyzes the operations whether they can create a deadlock situation or not, If they
do, that transaction is never allowed to be executed.
Deadlock prevention mechanism proposes two schemes:
Wait-Die Scheme: In this scheme, If a transaction requests a resource that is locked
by another transaction, then the DBMS simply checks the timestamp of both
transactions and allows the older transaction to wait until the resource is available
for execution.
Suppose, there are two transactions T1 and T2, and Let the timestamp of any
transaction T be TS (T). Now, If there is a lock on T2 by some other transaction and
T1 is requesting resources held by T2, then DBMS performs the following actions:
Checks if TS (T1) < TS (T2) – if T1 is the older transaction and T2 has held some resource,
then it allows T1 to wait until resource is available for execution. That means if a younger
transaction has locked some resource and an older transaction is waiting for it, then an
older transaction is allowed to wait for it till it is available. If T1 is an older transaction and
has held some resource with it and if T2 is waiting for it, then T2 is killed and restarted later
with random delay but with the same timestamp. i.e. if the older transaction has held some
resource and the younger transaction waits for the resource, then the younger transaction
is killed and restarted with a very minute delay with the same timestamp.
This scheme allows the older transaction to wait but kills the younger one.
Wound Wait Scheme: In this scheme, if an older transaction requests for a resource
held by a younger transaction, then an older transaction forces a younger
transaction to kill the transaction and release the resource. The younger transaction
is restarted with a minute delay but with the same timestamp. If the younger
transaction is requesting a resource that is held by an older one, then the younger
transaction is asked to wait till the older one releases it.
The following table lists the differences between Wait – Die and Wound -Wait scheme
prevention schemes:
In this, older transactions must wait for the In this, older transactions never wait
younger one to release its data items. for younger transactions.
The number of aborts and rollbacks is higher in In this, the number of aborts and
these techniques. rollback is lesser.
The two-phase locking protocol divides the execution phase of the
transaction into three parts.
In the second part, the transaction acquires all the locks. The third
phase is started as soon as the transaction releases its first lock.
In the third phase, the transaction cannot demand any new locks. It
only releases the acquired locks.
Example:
The following way shows how unlocking and locking work with 2-PL.
Transaction T1:
Transaction T2:
The only difference between 2PL and strict 2PL is that Strict-2PL
does not release a lock after using it.
Strict-2PL waits until the whole transaction to commit, and then it
releases all the locks at a time.
Strict-2PL protocol does not have shrinking phase of lock release.
1. Growing Phase:
During the growing phase, a transaction can acquire locks but
cannot release any locks.
When a transaction requests a lock on a data item, it must
wait until the lock is granted. Once granted, the transaction
holds the lock until the end of the transaction.
The transaction is allowed to acquire multiple locks on
different data items during its execution.
2. Shrinking Phase:
Once a transaction releases its first lock, it enters the
shrinking phase.
In the shrinking phase, the transaction cannot acquire any
new locks but can release locks it currently holds.
Once a lock is released in the shrinking phase, it cannot
acquire any new locks afterward.
Locking is Two-Phased:
The protocol ensures that transactions go through the growing
phase where locks are acquired and the shrinking phase
where locks are released.
This two-phased approach helps in preventing issues such as
circular waiting, which can lead to deadlocks.
Consistency with Serial Execution:
Because transactions cannot release any locks during the
growing phase, the final set of locks held by a transaction
reflects a point in its execution.
Releasing locks only starts happening in the shrinking phase,
and by then, no new locks can be acquired.
Avoidance of Cascading Aborts:
Once a transaction releases a lock, it cannot acquire any new
locks. This property helps prevent cascading aborts, where the
rollback of one transaction forces the rollback of dependent
transactions.