Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизDB-компоненты, многопользовательская среда, вылазят грабли Найти похожие ветки
← →
HabarovSergey (2006-01-23 15:00) [0]Здраствуйте. Помогите понять тонкости -
Использую стандартные DB-компоненты (Delphi6, MSSQL, ADO), но при запуске двух копий приложения возникают например такие грабли - вставляю в одном из них строку (форма с DB-эдитами и лоокапкомпобоксами). но при Post"е вылетает ошибка мол нельзя сохранить поскольку данные обновлялись, - если вторая копия хотябы открывала ту же таблицу хоть как то.
использую только
ADOConnection (уровень изоляции - курсор стабилити)
и
ADOQuery (установки - все типы курсора - статические на клиенте)
← →
Ega23 © (2006-01-23 15:03) [1]Блокируй запись. Можно с помощью транзакций (почитай в BOL), можно искусственно.
← →
HabarovSergey (2006-01-23 15:03) [2]подскажите, как можно решить подобного рода проблему? (или хотя бы киньте какойнить теорией)
ведь не отказыватса же от DB-компонентов в сторону ручного кодирования запросов...
← →
Виталий Панасенко (2006-01-23 15:07) [3]
> Ega23 © (23.01.06 15:03) [1]
> Блокируй запись. Можно с помощью транзакций (почитай в BOL),
> можно искусственно.
Я не спец в MS SQL, но, кажись, после такого (с помощью транзакций) блокируется ВСЯ таблица. т.е. другой юзер вообще ничего не сможет сделать, пока первый не подтвердит/отменит транзакцию... Причем, именно, вообще ничего, даже не прочитает данные
← →
HabarovSergey (2006-01-23 15:09) [4]тоесть как блокировать? если я её только добавляю.
простейший пример. DB-грид - данные выбраны и отсортированы по определенному критерию из одной таблицы - пользователи нажимают кнопку добавить запись . делаетса инсерт и у них появляетса форма с ДБедитами. далее они нажимают сохранить и вызываетса Post для этой записи (а после Post"а ДБ-грит обновляетса закрытием и открытием). Так вот очень часто вываливает ошибка при вызове Post что данные уже изменены мол и наотрес отказываетса делать Post
← →
HabarovSergey (2006-01-23 15:10) [5]имеетаса ввиду когда несколько пользователей работают в нескольких экземплярах этой программы-примера
← →
Виталий Панасенко (2006-01-23 15:11) [6]А ключ у таблицы есть ? Может, из-за отстутствия ключа ?
← →
HabarovSergey (2006-01-23 15:14) [7]нет ключа. сейчас сделаю все раскажу
← →
HabarovSergey (2006-01-23 15:19) [8]нет. не помогло
ошибка
"Row cannot be located for updating. Some values may have been changed since it was last read."
← →
Ega23 © (2006-01-23 15:22) [9]
> Я не спец в MS SQL, но, кажись, после такого (с помощью
> транзакций) блокируется ВСЯ таблица. т.е. другой юзер вообще
> ничего не сможет сделать, пока первый не подтвердит/отменит
> транзакцию... Причем, именно, вообще ничего, даже не прочитает
> данные
Ну, на грязное чтение, вроде можно надеяться... Там же 4 уровня изоляции.
← →
Виталий Панасенко (2006-01-23 15:49) [10]
> HabarovSergey (23.01.06 15:19) [8]
> нет. не помогло
> ошибка
> "Row cannot be located for updating. Some values may have
> been changed since it was last read."
Значит, где-то, что-то "накрутил".
← →
HabarovSergey (2006-01-23 16:16) [11]нет, Виталий. ниче не накручено. в чем может быть проблема - описал все как есть
может типы курсоров надо поменять?
← →
HabarovSergey (2006-01-23 16:19) [12]именно когда Insert использую. когда просто редактирую запись то все ок
← →
HabarovSergey (2006-01-23 16:21) [13]забыл сказать на таблицу на добавление AFTER триггер стоит. вычисляет значение одного столбца
← →
HabarovSergey (2006-01-23 16:23) [14]вот такой -
CREATE TRIGGER ecol_razresheniya_NOMER_zayavki ON dbo.ecol_razresheniya
FOR INSERT
AS
update ecol_razresheniya set NOMER_ZAYAVKI=(
select ( case when max(nomer_zayavki) is null then 0 else max(nomer_zayavki) end)+1 from ecol_razresheniya
where Year(DATA_ZAYAVKI)=Year((select top 1 DATA_ZAYAVKI from inserted))
)
where NOMER_ZAYAVKI=NULL
← →
HabarovSergey (2006-01-23 16:35) [15]а как блокировать запись с помощью транзакции и исскуственно?
транзакции я использую:
ADOConnection.BeginTrans
ADOConnection.CommitTrans
← →
sniknik © (2006-01-23 16:59) [16]> нет ключа. сейчас сделаю все раскажу
> ошибка
> "Row cannot be located for updating. Some values may have been changed since it was last read."
без ключа так и будет т.к. операция на обновление состовляется с условием по значениям всех полей ... которые (одно из них) возможно изменилось т.к. открывалась другая сессия. и при этом есть риск изменить вообще не ту запись поэтому ошибка закономерна.
чтобы не было надо обязательно дабавить ключь и указать чтобы адресация для управляющих запросов делалась по нему.
ADODataSet.Properties["Update Criteria"].Value:= adCriteriaKey;
> а как блокировать запись с помощью транзакции и исскуственно?
вообще не надо
> транзакции я использую:
> ADOConnection.BeginTrans
> ADOConnection.CommitTrans
лучше делай серверные SQL-ными командами. (но пока, еще лучше, совсем убери. т.к. подозрение (по [0]) что для одной команды ее делаеш. лишнее. и что еще хуже на обновления в DBEdit-ах...)
← →
HabarovSergey (2006-01-23 17:03) [17]триггер убрал все вроде заработало но теперь проблема с тем как присвоить
NOMER_ZAYAVKI с инкрементом в 1 в каждом году последовательно, и при том что бы эти номера не "перескакивали" если например кто то отменить ранее запущенную транзакцию
← →
msguns © (2006-01-23 17:04) [18]Читать о тразакциях в скале до полного просветления.
← →
HabarovSergey (2006-01-23 17:10) [19]там четыре уровня я их теоретически знаю - хотя мне это всеравно не дает понятия как лучше сделать (и воопще сделать) задачку с NOMER_ZAYAVKI
← →
HabarovSergey (2006-01-23 17:12) [20]именно что бы они последовательно инкрементировались и не было "пробелов"
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c