Здравствуйте, sushko, Вы писали:
S>Вообще, я не понимаю, о чем мы спорим. А заблокировал запись, В пытается ее изменить в WAIT-транзакции, и эта транзакция В подвисает до тех пор, пока не закончится транзакция А, и это правильно. Но почему-то по завершении транзакции А транзакция В не начинает работать, как можно было бы предположить по смыслу слова WAIT, а завершается с ошибкой. В чем тогда смысл параметра WAIT у транзакции В?
Ты про это?
WAIT / NO WAIT (константы wait и nowait) — Режимы обработки конфликтов блокировок. Если транзакция стартует в режиме WAIT (по умолчанию), и при выполнении операции (как правило, изменения данных, за исключением режима no_rec_version) обнаруживается конфликт, то операция "замораживается" до разрешения конфликта. В режиме NO WAIT сообщение о конфликте выдается приложению немедленно (возникает ошибка), а операция, которая привела к конфликту, отменяется. В случае взаимоблокировки двух wait-транзакций сервер автоматически обнаруживает эту ситуацию, и разблокирует одну из транзакций (как будто она стартовала как nowait) через интервал времени, определенный в IBCONFIG параметром DEADLOCK_TIMEOUT, который по умолчанию равен 10 секундам.
Тогда — короткие транзакции. Пусть себе клиент А сколь угодно пьет кофе и курит в курилке. Но реальные изменения происходить будут, как только он нажмет кнопку. То есть, ты вычитываешь для него количество товара, он его изменил и пошел курить. Клиент В в этот момент пусть себе продает — запись ведь не заблокирована! И как только клиент А нажимает кнопку, — стартует транзакция, подтверждающая его изменения.
З.Ы. А вообще я бы делал не так. Приход — одна таблица, расход — другая. А итоговая цифра просто результат вычислений по этим таблицам.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>