Статья "Транзакции в InterBase"
Добавлено: 06 фев 2006, 06:38
Обнаружил, как мне кажется, неточность в статье "Транзакции в Interbase" http://www.ibase.ru/devinfo/ibtrans.htm, глава "Опять 25 про deadlock".
Цитата:
"Поскольку мы уже в курсе про consistency транзакции, то элементарно получить deadlock если стартовать два приложения с транзакцией
consistency
wait
и сначала изменить одну запись в одном приложении (это приложение "повиснет"), а затем изменить другую запись во втором приложении (оно тоже зависнет). Через секунд этак 10-15 (определяется параметром DEADLOCK_TIMEOUT в ibconfig) InterBase выдаст сообщение deadlock, и разблокирует первое приложение. Второе останется "висеть".
Для разблокирования второго приложения есть только один выход - завершить транзакцию в первом приложении. Т.е. это конфликт на уровне блокировок таблиц, а не записей. Разумеется, нигде, кроме транзакций consistency (или применения блокировок protected), такая ситуация не встречается."
1) Почему должно повиснуть первое приложение? В нем транзакция обратилась к незаблокированной таблице, и изменение должно пройти без проблем.
2) Я думаю, что указанный случай нельзя назвать deadlock-ом, ибо всё нормально разрешается, как только завершается тем или иным способом первая транзакция. Deadlock должен возникнуть если первоначально каждая из транзакций изменят беспрепятственно записи в разных таблицах, заблокировав их, а потом попытаются изменить запись в "чужих" таблица.
Цитата:
"Поскольку мы уже в курсе про consistency транзакции, то элементарно получить deadlock если стартовать два приложения с транзакцией
consistency
wait
и сначала изменить одну запись в одном приложении (это приложение "повиснет"), а затем изменить другую запись во втором приложении (оно тоже зависнет). Через секунд этак 10-15 (определяется параметром DEADLOCK_TIMEOUT в ibconfig) InterBase выдаст сообщение deadlock, и разблокирует первое приложение. Второе останется "висеть".
Для разблокирования второго приложения есть только один выход - завершить транзакцию в первом приложении. Т.е. это конфликт на уровне блокировок таблиц, а не записей. Разумеется, нигде, кроме транзакций consistency (или применения блокировок protected), такая ситуация не встречается."
1) Почему должно повиснуть первое приложение? В нем транзакция обратилась к незаблокированной таблице, и изменение должно пройти без проблем.
2) Я думаю, что указанный случай нельзя назвать deadlock-ом, ибо всё нормально разрешается, как только завершается тем или иным способом первая транзакция. Deadlock должен возникнуть если первоначально каждая из транзакций изменят беспрепятственно записи в разных таблицах, заблокировав их, а потом попытаются изменить запись в "чужих" таблица.