

In case of a deadlock, the current transaction will roll back, unless the other transactions have a lower deadlock priority value. The DEADLOCK_PRIORITY session can accept any integer between -10 and 10, or pre-defined values such as LOW (-5), NORMAL (0) or HIGH (5). SQL Server allows you to control which transaction is more likely to be rolled back during a deadlock situation via the DEADLOCK_PRIORITY session variable. OracleĪccording to the Oracle documentation, the transaction that detected the deadlock is the one whose statement will be rolled back.

As a rule of thumb, the database might choose to roll back the transaction with a lower rollback cost. While the database chooses to roll back one of the two transactions being stuck, it's not always possible to predict which one will be rolled back. Hence, a rollback leaves the database in a consistent state. Unlike the JVM, a database transaction is designed as an atomic unit of work. When a cycle is detected, the database engine picks one transaction and aborts it, causing its locks to be released, so that the other transaction can make progress. The database engine runs a separate process that scans the current conflict graph for lock-wait cycles (which are caused by deadlocks). Preserving the lock order becomes the responsibility of the data access layer, and the database can only assist in recovering from a deadlock situation. However, a database system cannot enforce a given lock acquisition order since it's impossible to foresee what other locks a certain transaction will want to acquire further. Instead, Java defines an interrupt method, which acts as a hint as a thread that gets interrupted can simply ignore the interruption and continue its execution.įor this reason, a Java application cannot recover from a deadlock situation, and it is the responsibility of the application developer to order the lock acquisition requests in such a way that deadlocks can never occur. If this happens in a Java application, the JVM cannot just force a Thread to stop its execution and release its locks.Įven if the Thread class exposes a stop method, that method has been deprecated since Java 1.1 because it can cause objects to be left in an inconsistent state after a thread is stopped. Deadlocks can occur in any concurrency environment, not just in a database system.įor instance, a multithreading program can deadlock if two or more threads are waiting on locks that were previously acquired so that no thread can make any progress.

If you're using a Concurrency Control algorithm that relies on locks, then there is always the risk of running in a deadlock situation. When you configure your system for deadlock and lockwait timeouts and an application could be chosen as a victim when the transaction times out, you should program your application to handle them.Because both transactions are in the lock acquisition phase, neither one releases a lock prior to acquiring the next one.
