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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
2-1140765515
Alex17
2006-02-24 10:18
2006.03.12
Чтение


2-1140611437
denis24
2006-02-22 15:30
2006.03.12
Удаление контролов с формы в цикле


1-1139215284
Int_64
2006-02-06 11:41
2006.03.12
Как запустить приложение в виде дочернего окна в MDI-приложении?


2-1140499747
ALIES
2006-02-21 08:29
2006.03.12
Два соединения в BDE


8-1128784676
beglec
2005-10-08 19:17
2006.03.12
Как сделать TImage полупрозрачным?