Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Rabota s BD


Slv ©   (2003-05-23 10:59:00) 

Obrabotka tranzaktii v Mnogopolizovateliskom regime
Delphi 6 + Interbase 7. Rabotaet cerez componenti

Error:
Deadllock. Update conflicts with concurrent update.

Vopros: Kak oboiti ?


Zacho   (2003-05-23 13:40:00) [1]


> Slv (23.05.03 13:25)

При уровне изоляции SNAPSHOT (concurrency) Lock conflict может возникнуть только при изменении одной и той же записи разными транзакциями.


Slv   (2003-05-23 13:25:00) [2]

В IBTransaction. params =concurrency.


Zacho   (2003-05-23 12:34:00) [3]


> Slv (23.05.03 12:12)
> Дело втом что пользователям расспределяются разные записи
> или группа записей из одной и той же таблицы.

И что ? Или уровень изоляции транзакций SNAPSHOT TABLE STABILITY ?


Slv   (2003-05-23 12:12:00) [4]

Дело втом что пользователям расспределяются разные записи или группа записей из одной и той же таблицы.


Zacho   (2003-05-23 12:01:00) [5]


> Slv (23.05.03 11:56)

Значит, не на разных.


Slv   (2003-05-23 11:56:00) [6]

Если можно еще немного о сути этой ситуации.
Есть форма на которой есть DB-компоненты и несколько компонент, посредством которых осуществляется ввод данных вручную.

Когда несколько пользователей одновременно активизируют "Save", обрабатываются данные, затем выполняется "Transaction.CommitRetaining". В этом месте и появляется ошибка, хотя пользователи "сидят" на разных записях


Johnmen   (2003-05-23 11:52:00) [7]

>Slv

Скондачка ты свою проблему не решишь ! Потому, что тебе не хватает знаний. Куда за ними идти, уже сказали. Не поняв механизмов и принципов работы SQL сервера и клиентского приложения, ты не сможешь грамотно реализовать желаемое...:)


Zacho   (2003-05-23 11:44:00) [8]


> Slv (23.05.03 11:39)

Просто укажи в параметрах транзакций WAIT.
Кстати, в этом случае тоже "потеряются" данные, внесенные транзакцией, завершившейся раньше.
И еще: пишущие транзакции должны быть как можно более короткими.


Slv   (2003-05-23 11:39:00) [9]



try
Transaction.CommitRetaining;
except
Transaction.RollbackRetaining;
end;

Этот вариант не приемлем т.к. в этом случае теряются данные.
Было бы хорошо чтобы по "except" эти данные установить в очередь на update данных.


Zacho   (2003-05-23 11:31:00) [10]

Ладно, если кратко: это происходит, когда какя-либо транзакция пытается изменить запись, измененную в другой не завершившейся транзакции. Делай выводы.
Обходить не надо. Надо правильно обработать.


Johnmen   (2003-05-23 11:31:00) [11]

Как обойти ?
try
Transaction.CommitRetaining;
except
Transaction.RollbackRetaining;
end;


А по хорошему, читать, читать и читать документацию...:)


Slv   (2003-05-23 11:21:00) [12]

IBX.

Само собой почитаем. Но к сожалению уровень срочности равен значению "ВЧЕРА". Время решения вопроса минимально.


Zacho   (2003-05-23 11:11:00) [13]


> Slv (23.05.03 11:08)
> Через компоненты прямого доступа.

Через какие именно ? IBX, FIBPlus, IBO, ADO+IBProvider ...
И почитай все-таки статьи, и разберись как работать с транзакциями в IB


Slv   (2003-05-23 11:08:00) [14]

Через компоненты прямого доступа.
Проблема в том что когда несколько пользователей одновременно выполняют "Transaction.CommitRetaining" выдает вышеуказанную ошибкую


Zacho   (2003-05-23 11:02:00) [15]

Через какие компоненты ?
Читать http://www.ibase.ru/devinfo/ibtrans.htm, http://www.ibase.ru/devinfo/ibxtrans.htmи другие статьи на http://www.ibase.ru/develop.htmраздел "Транзакции, архитектура IB"


Наверх

Титульная страница Поиск, карта сайта Написать письмо