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

Вниз

Проблемы с уровнем изоляции в MS SQL !   Найти похожие ветки 

 
AlexGof ©   (2003-04-28 12:51) [0]

Уважаемые матера ! Помогите решить проблему. У меня 1 родительская и 3 подчиненных таблицы связанных через master filds в компонентах ADODataSet, все они привязаны к визуальным компонентам типа DBGrid, DBCtrGridEh, DBEdit и. т. п., когда добавляю запись в родительскую таблицу методом append то значение indetity с сервера еще естественно не приходит и дочерние таблицы не связываются с родительской. Можно конечно сделать на родительской append и UpdateBatch, тогда indetity появиться, но не произведешь откат сразу всей группы подчиненных записей, т. е. придется удалаять из родительской при откате запись. Посоветовали открыть транзакцию, открыл так
ADOConnection.BeginTrans
ADODataSet.Append
ADODаtaSet.UpdateBatch
Затем индетити появляется, вношу записи в сязанные дочерние, таблицы ADOConnection.CommitTrans и все о"кей. Но в это время другой пользователь, не может открыть эту таблицу, просто в приложение ничего не выгружатся из данных этой таблицы.
Мне кажется, что проблема кроется в уровне изоляции транзакции, как ее решить не знаю, пробовал в ADOConnection.IsolationLevel менять уровни изоляции, о увы не помогает. Если не открывать транзакции, то без индетити, в визуальных компонентах полная чехарда естественно, в таблицах левые записи появляются и. т. п.
Помогите, кто знает что делать.


 
MOA ©   (2003-04-28 13:29) [1]

Не, так делать не рекомендуется (IMHO, нельзя). Напишите хранимые процедуры на сервере, которые будут вставлять и удалять нужные записи, можно попробовать включить каскадное удаление - для "октата".
Можно поиграться с уровнем изоляции (запросов на запись и чтение), но этот путь практически неизбежно приведёт к ещё большей грыже (опять, IMHO).
Удачи!


 
АлексейК   (2003-04-28 14:04) [2]

1. Свойство IsolationLevel не менят уровень изоляции транзакций для данного соединения установленный по умолчанию на сервере, для конкретной сессии придется выполнить команду SQL. У него немого другое назначение.
2. Начав явно тразакцию, ты блокируешь, в данном случае, запись с которой работаешь и пока тразакция не завершится, эту запись нельзя выбрать. Следовательно другой пользователь пытается сделать запрос и в его набор данных входит данная запись, естественно, что запрос будет сначала ожидать завершение твой тразакции и снятия блоктровки а лишь потом выполнятся. В приципе, хинт nolock в запросе позволяет решить данную роблему, но появляется новая - проблема грязного чтения. Если тебя это не пугает то можно смело им воспользоваться.
3. Следует обратить внимание на свойство LockType. Вот оно и управляет блокировками. Следуется стараться задавать значение ltOptimistic.
Хотя в приципе данную вставку лучше делать через хранимые процедуры.



Страницы: 1 вся ветка

Текущий архив: 2003.05.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
1-59750
ed18
2003-05-06 10:24
2003.05.19
Как вычислить длину строки в пикселях?


4-59998
DelphiN!
2003-03-21 12:15
2003.05.19
Как узнать handle текущего элемента и окна(имеющего фокус)


14-59871
ooooooo
2003-04-29 10:00
2003.05.19
Как программно отправить SMS?


1-59739
Anna
2003-05-06 09:05
2003.05.19
QuickReport


1-59704
Marina_S
2003-05-05 17:02
2003.05.19
как создать avi файлы ?