Форум: "Базы";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
ВнизПроблемы с уровнем изоляции в 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c