Sobes.tech
Junior

Er zijn twee transacties. Eerst voert de eerste transactie een commando uit. Daarna voert de tweede transactie een commando uit. Vervolgens gaat de eerste transactie verder. Welke volgorde leidt tot een deadlock? ```sql -- eerste transactie update accounts set balance = balance + 100 where id = ?; -- tweede transactie update accounts set balance = balance - 50 where id = ?; update accounts set balance = balance + 200 where id = ?; ```

sobes.tech AI

Antwoord van AI

Взаимоблокировка (deadlock) возникает, если транзакции блокируют ресурсы в разном порядке и ждут друг друга.

В данном случае:

  • Первая транзакция обновляет баланс по id = A (предположим).
  • Вторая транзакция обновляет баланс по id = B, затем по id = C.
  • Первая транзакция продолжает выполнение и пытается обновить баланс по id = C.

Если первая транзакция заблокировала запись с id = A, а вторая транзакция заблокировала запись с id = C, и теперь первая пытается получить блокировку на id = C, а вторая — на id = A, то возникает взаимоблокировка.

Последовательность, приводящая к deadlock:

  1. Первая транзакция блокирует запись с id = A.
  2. Вторая транзакция блокирует запись с id = C.
  3. Первая транзакция пытается обновить запись с id = C (ждет освобождения).
  4. Вторая транзакция пытается обновить запись с id = A (ждет освобождения).

Обе транзакции ждут друг друга, что и вызывает deadlock.