Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Транзакция на обновление записи   Найти похожие ветки 

 
RomanH ©   (2006-10-31 12:20) [0]

Мастера, и снова я к Вам, за вашей помощью. Существует таблица, в которой находится список и колличество товара для продажи клиентам. При выборе какой нибудь записи, появляется  модальное окно для выбора колличества товара(т.е. у пользователя А стартует транзакция с параметрами {write,concurrency,nowait}).После выбора колличества, создаю накладную, а в основном списке уменьшаю колличество, подтверждаю транзакцию.В это же время пользователь B тоже хочет продать этот же товар но возникает ошибка deadlock update conflict.Помогите пожайлусто, как сделать чтобы два пользователя могли продавать(в моем случае редактировать т.е. уменьшать колличество в основной таблице)


 
unknown ©   (2006-10-31 12:41) [1]


> RomanH ©   (31.10.06 12:20)
> модальное окно для выбора колличества товара(т.е. у пользователя А стартует транзакция

Вот тут неправильно.
В таких случаях лучше всего сделать так:
1) Показываем форму, юзер заполняет на форме поля
2) Формируем запрос, далее starttransaction; execsql; commit;
Можно в принципе и уровень изоляции поменять.


 
RomanH ©   (2006-10-31 12:41) [2]

Мастера ну вот получилось, с такими параметрами
read_committed
rec_version
nowait

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


 
jack128 ©   (2006-10-31 12:50) [3]

на ib/fb с транзакциями обычно работают так:
все чтение один через транзакцию с параметрами
read_committed
rec_version
nowait
read
Обычно она открывается при старте приложения и закрывается при его завершении.

для записи используется __максимально короткая__ транзакция
write
read_committed
rec_version
nowait
открыл эту транзакцию, выполнил запрос, тут же закрыл её. Никаких открытий write транзакций при открытии модального диалога быть не должно!!!

При такой работе update conflict практически невозможен.

RomanH ©   (31.10.06 12:41) [2]
а где жевозможность писать поддвержденные данные.

не очень понятно, что имеется в виду?


 
RomanH ©   (2006-10-31 13:04) [4]


> jack128 ©

Выше указанный код :
write
read_committed
rec_version
nowait
мне все объяснил я увидел слово write.
Хотя и без параметра write работает, почему? мы же только считываем подтвержденные записи(read_committed).Объсните мнe пожайлусто
.


 
Desdechado ©   (2006-10-31 13:10) [5]

читать доки и ibase.ru до прояснения

> а где жевозможность писать поддвержденные данные
Орех!
Как ты себе представляешь запись неподтвержденных данных?

ЗЫ про дедлоки тоже читать там же
они возникают, когда в разных режимах пытаешься писать данные в разном порядке, что вызывает конфликт при использовании этих режимов в разных подключениях


 
RomanH ©   (2006-10-31 13:20) [6]

Ну вот один из моих основных преподавателей Desdechado (это не лесть-это правда) отправляет меня на IBase.ru/Хотя там я уже можно сказать прописан, даже скачал весь сайт.
Ну ладно буду читать до прояснения(сколько же времени это займет).
Может существует наработанная практика по работе с транзакциями. Спасибо всем.


 
Sergey13 ©   (2006-10-31 13:35) [7]

> Может существует наработанная практика по работе с транзакциями.

А чем [1] + [3] не устраивает?


 
Anatoly Podgoretsky ©   (2006-10-31 15:34) [8]

> RomanH  (31.10.2006 13:20:06)  [6]

> отправляет меня на меня на IBase.ru

С каких пор отправление в правильном направлении стало обидой?


 
Johnmen ©   (2006-10-31 15:39) [9]


> RomanH ©   (31.10.06 13:20) [6]
> ...даже скачал весь сайт.


Судя по вопросу, осталось прочитать. Хотя бы основы.


 
RomanH ©   (2006-10-31 16:02) [10]


> Anatoly Podgoretsky ©  

Да нет это не обида. Просто очень хочется такую информацию чтобы было понятно все о транзакциях, хотя Дмитрий Кузьменко(ibase.ru) и описывает подробно о транзакциях все же некоторые аспекты непонятны. Наверное понимание прийдет с опытом.Сегодня транзакция на обновление записей,завтра на чтение. Надеюсь этот форум мне всегда поможет.

> Sergey13 ©   (31.10.06 13:35) [7]

Да как раз [1]+[3] и разрешили мою проблему сегодня.

Всем спасибо


 
Дмитрий Белькевич ©   (2006-11-01 03:09) [11]

>на ib/fb с транзакциями обычно работают так:
все чтение один через транзакцию с параметрами
Обычно она открывается при старте приложения и закрывается при его завершении.
для записи используется __максимально короткая__ транзакция
При такой работе update conflict практически невозможен.

Прочитай это раньше, не было бы у меня в своё время продолжительного секса с транзакциями, а так сам дошел до такой же схемы - длиной читающей и очень короткой пишущей транзакции.
Тем не менее, крайне редко (и то, если сам специально провоцирую) дедлоки, вернее апдейт конфликты появляются, но можно и их отловить и запрос повторить.


 
atruhin ©   (2006-11-01 12:38) [12]

> После выбора колличества, создаю накладную, а в основном
> списке уменьшаю колличество, подтверждаю транзакцию.В это
> же время пользователь B тоже хочет продать этот же товар
> но возникает ошибка deadlock update conflict.

Тут еще и методологически не правильно, представь, пользователь выбрал товар, ту уменьшил его кол-во на складе (основной список),
а дальше произошел сбой сети, или компьютер вырубили. Что будет, со склада ты товар списал, а куда?
Изучай теорию построения учетных систем. Статей море.


 
PEAKTOP ©   (2006-11-01 13:50) [13]

Я обычно в таких случаях в журнале документов (таблице, где хранится "шапочная" часть документа) добавляю поле FLAG_COMMIT. Пользователи могут колотить накладные хоть до посинения, фактическое списание товара происходит в момент проведенения (установки FLAG_COMMIT= 1), а возврат "на место" в момент распроведения (установки FLAG_COMMIT= 0), причем все происходит в триггерах на BEFORE UPDATE.
Таким образом, если кто-то провел накладную на доли секунды раньше, то второй при недостатке товара получит облом при проведении. А там пусть сами (пользователи) между собой разбираются, кому товар нужнее.
Таким же образом решается проблема, когда нужно наколотить накладную "в прок". Т.е. клиент по телефону заказывает товар, а оплачивать/получать придет через час. И по бизнес логике предприятия, отпускать товар нужно в момент оплаты/получения. Если его к тому моменту не оказалось в наличии, то уж извините, не успели.


 
atruhin ©   (2006-11-01 14:58) [14]

> [13] PEAKTOP ©   (01.11.06 13:50)

Ну это обычная практика, только у нас например, > добавляю поле FLAG_COMMIT
может иметь значения:
0 - удален
1 - в работе (не закончен)
2 - документ набран (готов)
3 - проведен
4 - закрыт (гл. бухгатер, руководитьель закрыл период, ни кто не может изменить.


 
Anatoly Podgoretsky ©   (2006-11-01 15:08) [15]

> atruhin  (01.11.2006 14:58:14)  [14]

Если сделано на уровне триггеров/процедур то нормально.


 
atruhin ©   (2006-11-01 15:22) [16]

> Если сделано на уровне триггеров/процедур то нормально.

Ну а как же еще? Именно об этом я и написал автору 4-мя постами выше.


 
Anatoly Podgoretsky ©   (2006-11-01 15:28) [17]

> atruhin  (01.11.2006 15:22:16)  [16]

Может быть, но это 4 выше и возможно не к этому случаю.
Если подобное не сделано указаными способами, то кто мешает мне
альтернативными методами изменить запись в обход.


 
atruhin ©   (2006-11-01 15:34) [18]

> [17] Anatoly Podgoretsky ©   (01.11.06 15:28)
то кто мешает мне альтернативными методами изменить запись в обход

У нас ни кто не помешает, при наличии пароля владельца БД или SYSDBA. А для остальных, модифицируемые представления,
с соответствующими тригерами.


 
Anatoly Podgoretsky ©   (2006-11-01 16:20) [19]

> atruhin  (01.11.2006 15:34:18)  [18]

А у нас помешает даже при наличии этого пароля.


 
atruhin ©   (2006-11-01 16:56) [20]

Ну никто и не спорит. Просто нам так удобнее. А дыр у FB, к сожалению, пока достаточно,
что бы при желании вывести из строя БД, не зависимо от прав.
Тем более, о тригерах на основные таблицы, копий не мало ломано, иногда удобно, изменить значение
в таблице, зная что это больше ни чего не затронет.



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.037 c
2-1167990875
forex
2007-01-05 12:54
2007.01.21
эмулятор командной строки


2-1167998104
dddd
2007-01-05 14:55
2007.01.21
конвертация типа integer в Date


9-1142413694
:-))
2006-03-15 12:08
2007.01.21
Изучение DelphiX


2-1167557715
4ipset
2006-12-31 12:35
2007.01.21
Запись в реестр


3-1162205718
oleg_v
2006-10-30 13:55
2007.01.21
как обнулить (обновить) поле Autoincrement(+)