Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.045 c
11-1144151482
BaryVetaL
2006-04-04 15:51
2007.01.21
Новый компонент BVLedNumber


15-1167494417
red_imp
2006-12-30 19:00
2007.01.21
Фрактал Минковского


6-1156377385
dexer
2006-08-24 03:56
2007.01.21
Как передать файл, от ServerSockets к ClientSockets


2-1167371820
hero
2006-12-29 08:57
2007.01.21
Как имея ID процесса узнать имя файла и путь этого процесса?


15-1167065363
oldman
2006-12-25 19:49
2007.01.21
Я вот, в школьные годы, всегда считал...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский