Статья "Транзакции в InterBase"

Модератор: kdv

Ответить
Quasar
Сообщения: 61
Зарегистрирован: 23 дек 2005, 10:26

Статья "Транзакции в InterBase"

Сообщение Quasar » 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 должен возникнуть если первоначально каждая из транзакций изменят беспрепятственно записи в разных таблицах, заблокировав их, а потом попытаются изменить запись в "чужих" таблица.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 фев 2006, 10:13

1) Почему должно повиснуть первое приложение? В нем транзакция обратилась к незаблокированной таблице, и изменение должно пройти без проблем.
:) потому что consistency - это режим блокирования ТАБЛИЦ. Просто было дольше объяснять deadlock на примере блокирования одной и той же записи в режиме concurrency.
2) Я думаю, что указанный случай нельзя назвать deadlock-ом, ибо всё нормально разрешается, как только завершается тем или иным способом первая транзакция.
это как это? deadlock - это взаимоблокировка, что бы ни явилось ее причиной - блокировка на одной записи, или блокировка на одной таблице.
Deadlock должен возникнуть если первоначально каждая из транзакций изменят беспрепятственно записи в разных таблицах, заблокировав их, а потом попытаются изменить запись в "чужих" таблица.
бррр...

Quasar
Сообщения: 61
Зарегистрирован: 23 дек 2005, 10:26

Сообщение Quasar » 06 фев 2006, 11:05

Похоже, что я что-то неправильно понял в этой статье. :)
потому что consistency - это режим блокирования ТАБЛИЦ.
Но ведь блокировка происходит только после первого изменения в таблице, т.к. резервируемые таблицы в параметрах транзакции не указаны. Я сейчас проверил на примере, и у меня первое приложение не "зависает". Или в тексте статьи подразумевалось, что блокируемые таблицы указаны в параметрах транзакции? Но с другой стороны, тогда вторая транзакция с теми же параметрами не стартует, пока не закончится первая и взаимоблокировка не возникнет.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 фев 2006, 11:14

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

сейчас поправлю описание на обычную ситуацию с блокировкой 2-х разных записей.

чего то я перечитал себя уже 2 раза, и так и не понял, что я там про consistency имел в виду :-)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 фев 2006, 11:54

пришлось переписать этот раздел практически целиком. Если будут замечания по новому варианту - сообщите.

Ответить