Блокировка записей!!!

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

Блокировка записей!!!

Сообщение break » 28 фев 2007, 09:41

В своей программе я использовал блокировку записей! Например при открытии карточек, чтобы другой пользователь получил сообщение открывая ту карточку, которая уже открыта. Реализовал это посредством холостого апдейта первичного ключа.

таблица CLIENTS первичный ключ - ROW_ID

при открытии какой либо записи в отдельном окошке

update CLIENTS set ROW_ID = ROW_ID where ROW_ID = ?OLD_ROW_ID

Транзакция этого окошка завершится когда оно закроется - тогда другие пользователи смогут открывать эту запись!.

Этот принцип долгое время меня устраивал, но теперь столкнулся с проблемой. Если я хочу вставить в таблицу в которой имеется вторичный ключ на таблицу CLIENTS запись, которая сейчас открыта (произведен этот самый холостой апдейт) - то DEADLOCK.

Отказываться от вторичных ключей не хочется! Есть ли способ обхода этой особенности IB или мне необходимо поменять механизм блокировок записей???

Dmitry Beloshistov
Сообщения: 41
Зарегистрирован: 27 окт 2004, 11:06

Сообщение Dmitry Beloshistov » 28 фев 2007, 11:33


break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

Сообщение break » 28 фев 2007, 12:37

Спасибо!!!

Изучил - как я понял лучше всего использовать отдельную таблицу

APP_LOCKS(ROW_ID, XDATE) и блокировать холостым апдейтом ее.

Были мысли по поводу Select ... For Update With Lock - но попробовал не работает - похоже при такой блокировке отключаются только триггеры, а вторичные ключи всё же не дают вставить запись если ее карточка открыта!

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 28 фев 2007, 12:54

А что, в IB уже появился For update with lock?

break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

Сообщение break » 28 фев 2007, 13:22

Цитата из 2-ой ссылки:

В FB 1.5. включена новая функциональность -

Select ... From Table [Where ...] [Order By ...] For Update With Lock.

Синтаксис Select For Update присутствует в IB довольно давно, но его назначение не имело отношения к блокировке.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 28 фев 2007, 13:48

break писал(а):Есть ли способ обхода этой особенности IB
break писал(а):В FB 1.5. включена новая функциональность -
:?: :!: :?:
Т.е. ты предлагаешь обходить функциональность IB, заменяя ее на FB. Похвально.

Ответить