Добрый день!
Есть такой вопрос: как лучше использовать RFD в многопользовательских приложениях?
Поясню, что имеется ввиду: в проектируемой мной системе для задач автономного параллелизма будут использоваться пессимистические блокировки, причем на уровне сервера БД (предполагается использовать MSSQL Server 2000), что предусматривает выполнение запроса типа select for update если кто-то хочет забрать данные именно для обновления. Тогда на запись будет наложен запрет для редактирования любым пользователем, кроме того, кто выполнил запрос select for update.
В связи с этим интересует вопрос, будет ли разница между двумя вариантами кода, и будет ли все работать корректно:
1 вариант:
using (DbManager manager = new DbManager(_configurationString))
{//создается обьект DbManager, открывается новый коннект к БД
tmp = (DicRow)manager.SetSpCommand(
SP_GetEntityForUpdate, manager.InputParameter("i_ndicid", id))).ExecuteObject(typeof(DicRow));
}
//тут, насколько я понимаю, коннект к БД будет закрыт, используется отсоединенная модель, когда постоянного коннекта к БД нет
2 вариант
//обьект DbManager создается при инициализации приложения, в дальнейшем вся работа производится только через единственный экземпляр
//и, таким образом, через единственный коннект к БД
tmp = (DicRow)manager.SetSpCommand(
SP_GetEntityForUpdate, manager.InputParameter("i_ndicid", id))).ExecuteObject(typeof(DicRow));
//объект manager создается при инициализации приложения и коннект к БД таким образом постоянно открыт
я понимаю, что поддержка блокировок на уровне БД возможно только при втором варианте?
Может кто сталкивался с такими вопросами, как реализовывать параллельную работу и блокировки?
Буду благодарен за любую информацию.
Да, приложение типа "клиент-сервер", наличие тонкого клиента не предусматривается.
Заранее спасибо!
Avos
Здравствуйте, Avos, Вы писали:
A>Поясню, что имеется ввиду: в проектируемой мной системе для задач автономного параллелизма будут использоваться пессимистические блокировки, причем на уровне сервера БД (предполагается использовать MSSQL Server 2000), что предусматривает выполнение запроса типа select for update если кто-то хочет забрать данные именно для обновления.
Не надо так делать, особенно в SQL 2000... Для таких блокировок надо использовать session wide application lock (парочка процедур sp_GetAppLock/sp_ReleaseApplock), что бы хотя бы транзакцию не удерживать. Но все равно открытый connect придется держать все время работы с заблокированными данными.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Здравствуйте, Merle, Вы писали:
M>Здравствуйте, Avos, Вы писали:
A>>Поясню, что имеется ввиду: в проектируемой мной системе для задач автономного параллелизма будут использоваться пессимистические блокировки, причем на уровне сервера БД (предполагается использовать MSSQL Server 2000), что предусматривает выполнение запроса типа select for update если кто-то хочет забрать данные именно для обновления.
M>Не надо так делать, особенно в SQL 2000... Для таких блокировок надо использовать session wide application lock (парочка процедур sp_GetAppLock/sp_ReleaseApplock), что бы хотя бы транзакцию не удерживать. Но все равно открытый connect придется держать все время работы с заблокированными данными.
Спасибо за ответ!
Буду разбираться подробнее, но уже есть вопрос:
в поиске наткнулся на Ваш пост
здесьАвтор: Merle
Дата: 30.05.05
, где утверждается, что при использовании session wide application lock необхоидмо отключить пул коннектов.
А как это сделать?
и еще вопрос, про использование RFD, если Вы можете помочь: получается что экземпляр DbManager необходимо создавать в программе только один раз и использовать только его (используя таким образом единственный коннект к БД).
Но при таком сценарии при закрытии приложения не удается корректно очистить экземпляр DbManager, вываливается exception.
Как в таком случае корректно его использовать?
Заранее спасибо!
Avos
Здравствуйте, Avos, Вы писали:
A> где утверждается, что при использовании session wide application lock необхоидмо отключить пул коннектов.
A>А как это сделать?
В ConnectionString добавить ".. pooling=false", а вообще
http://www.connectionstrings.com/ твой лучший друг для таких вопросов.
A>Как в таком случае корректно его использовать?
Например создавать объект singleton и раздавать доступ к подключению через него.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>