Sobes.tech
Junior

İki əməliyyat mövcuddur. Birinci əməliyyat əvvəlcə bir əmri icra edir. Sonra, ikinci əməliyyat bir əmri icra edir. Daha sonra, birinci əməliyyat davam edir. Hansı ardıcıllıq qarşılıqlı bloklanmaya səbəb olar? ```sql -- birinci əməliyyat update accounts set balance = balance + 100 where id = ?; -- ikinci əməliyyat update accounts set balance = balance - 50 where id = ?; update accounts set balance = balance + 200 where id = ?; ```

sobes.tech Süni İntellekt

AI-dan cavab

Взаимоблокировка (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.