Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.021 c
1-1139375715
DelphiN!
2006-02-08 08:15
2006.03.12
Получить координаты компонента на экране


6-1131884786
NTFS
2005-11-13 15:26
2006.03.12
Как сделать что бы яваскрипт определял TWebBrouser не как ИЕ


15-1140366549
Fenik]
2006-02-19 19:29
2006.03.12
Ищу варган


15-1140442412
7BB
2006-02-20 16:33
2006.03.12
Читал недавно что Борланд остановил работы над Дельфи и C++!


1-1139337192
JIurasdfsdf
2006-02-07 21:33
2006.03.12
Как узнать какой обьет выделен.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский