2013-08-31 3 views
0

Я разрабатываю программное обеспечение, которое будет размещаться на нескольких компьютерах. БД разделяется. Мне нужна каждая машина, чтобы захватить уникальный ресурс (строку) из БД и заблокировать его.Как заблокировать общий ресурс базы данных между машинами

Мой вопрос: как я позабочусь об этом? потому что каждая машина читает одни и те же строки, и может произойти гонка.

В принципе я думаю, что его так же, как резьб, но разница в том, что я не могу разделить общий ресурс между ними ...

как это решаемая?

Спасибо!

+0

Что вы хотите сказать, заблокировав строку? только соответствующий компьютер может изменить его? – Kurubaran

+0

Да. Я хочу, чтобы одна машина «захватила» строку, сделайте некоторую работу, пока машины не будут работать в этой строке. – Himberjack

+0

Почему вам нужен механизм блокировки в первую очередь?вы рассматривали использование транзакций? вы можете найти эту ссылку полезной http://technet.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx –

ответ

0

У меня была аналогичная проблема, которую я решил, написав собственную процедуру блокировки на уровне базы данных.

В основном я добавил столбец, который я назвал «SessionLock», и был GUID.

Всякий раз, когда я делаю вызов базы данных, требующий блокировки, я использую хранимую процедуру для эмуляции тестового набора (я использую Update, если SessionLock не является нулевым и проверяет, являются ли возвращенные строки равными количеству строк, которые Я просил заблокировать его). Затем я выполняю некоторую работу над строками и разблокирую их после завершения.

Теперь у самих баз данных есть своя блокировка, поэтому вам может не понадобиться эта сложность. Но таким образом вы имеете полный контроль над строками.

0

Добавить дополнительный столбец в эту таблицу, который может хранить уникальное значение конкретного компьютера, например имя машины Environment.MachineName. каждая машина будет обновлять конкретную строку с собственным именем машины, когда она будет считывать таблицу в первый раз. Делая это, вы можете убедиться, что каждая строка может быть изменена только конкретной машиной.

  • Когда таблица ресурсов машины чтения очень первый раз, он получит первый рекорд, который не суммируется и не имеют название машины. (Предотвращение от написание строки другой машины заблокировано).

  • И он будет обновлять уникальный столбец этой строки с ее именем машины.

  • Всякий раз, когда машина хочет обновить строку, проверьте, соответствует ли имя машины этой строке и запрашиваемой машине.

  • После завершения всех операций очистите имя машины от определенной строки (освобождение ресурса).

+0

Но что обещает мне, что они не будут переопределять друг друга? – Himberjack

+0

Что вы имеете в виду, переопределяя друг друга? Вы можете уточнить свое требование? – Kurubaran

+0

У меня исправлены «ресурсы». каждый ресурс - это строка в БД, и каждая машина может ее захватить, работать над ней и выпускать. но я не могу иметь 2 машины на одном ресурсе. поэтому мне нужно как-то заблокировать его – Himberjack

0

Все серьезные системы баз данных имеют механизм блокировки строк и/или таблиц. Перед тем, как реализовать собственную блокировку homebrewn, проверьте, что ваша СУБД уже приводит в таблицу.

Вы не указали, какую СУБД вы используете, поэтому вам придется самому заниматься поисковой системой. Начать с "база данных замок" и посмотреть, куда он приведет вас.

+0

MSSQL .......... – Himberjack

Смежные вопросы