В общем, взаимоблокировка означает, что две или более сущностей блокируют некоторые источники, и ни одна из них не может завершить, потому что они циклически блокируют источники.
Один пример: допустим, у меня есть таблица A и таблица B, мне нужно обновить A, а затем B, и я решил заблокировать их в момент использования (это действительно глупое поведение, но это цель сейчас). В то же время кто-то другой делает то же самое в обратном порядке - сначала блокирует B, затем блокирует A.
Хронологически это происходит:
proc1: блокировка A
proc2: блокировка B
proc1: Блокировка B - начинает ждать, пока proc2 не выпустит B
proc2: Lock A - начинает ждать, пока proc1 не выпустит A
Очевидно, что ни один из них не закончит. Это тупик.
Дыра намного глубже, но это всего лишь вход, и если вам нужно знать больше, потратьте свое время. В нашем университете целые лекции об этом - так что не думайте, что чтение нескольких статей делает вас экспертом; -)