![]() |
|
Модераторы: Akina |
![]()
|
|
| mihanik |
|
|||
![]() -=Белый Медведь=- ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4054 Регистрация: 24.4.2006 Где: г. Тверь Репутация: 11 Всего: 109 |
Привет!
Описание проблемы. Нужно, чтобы к одной БД по локальной сети обращались пользователи на чтение/запись. Как проследить за тем, чтобы они одновременно не получали доступ к одной и той же записи в БД? Т.е. пока один запись читает/пишет, другой бы туда ничего не писал и не читал. Использую плоскую базу данных dBASE 5.0; (JET, Dynaset). PS. Локально всё работает, но нужно выходить в сеть... |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Файловые БД не поддерживают механизма блокировок. Решение лежит в области ручного обеспечения блокировки. В структуру файла вводится дополнительное поле LockerID. Если запись не блокирована, в ней содержится ноль, если там -1, она блокирована системно (административно), любое другое значение - это ID клиента, заблокировавшего запись. При сетевой работе наиболее удобно делать ID 64-битным и составлять его из МАС-адреса интерфейса (48 бит) и штампа времени запуска приложения или каким-либо образом формируемого на рабстанции номера сеанса (16 бит). При этом решается как проблема взаимных блокировок приложений с различных станций, так и нескольких экземпляров с одной станции (уникальность номера сеанса легко реализуется через мьютексы). Технология блокировок проста. Необходимые для работы записи блокируются попыткой записи своего ID вместо нулевого. После чего конечное состояние проверяется чтением, и если запись своего ID была успешна, с этой записью можно работать. По завершении работы LockerID опять обнуляется - запись отпускается. Зависшие блокировки снимаются как приложением с клиентской станции (выбираются все LockerID, относящиеся к этой станции, по МАС, после чего проверяется наличие мьютексов сеанса и обнуление всех ID для несуществующих на станции мьютексов), так и административно (обнуляются все LockerID, для которых не найдены МАС в списке текущих соединений сервера). Однако это все в корне неправильно. Следует перейти на клиент-серверную БД, где механизм блокировок уже реализован. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| mihanik |
|
|||
![]() -=Белый Медведь=- ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4054 Регистрация: 24.4.2006 Где: г. Тверь Репутация: 11 Всего: 109 |
Едею более или менее понял.
Спасибо! Немного непонятно, что такое "мьютекс"... Это сообщение отредактировал(а) mihanik - 5.5.2006, 12:43 |
|||
|
||||
| vbCrLf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.5.2006 Где: Севастополь Репутация: 1 Всего: 1 |
Если бы я реализовал это на VB, то у меня вышла бы следующая картина:
На машине с базой висит простенький сервер, который принимает заказы на чтение/запись в базе, и поочередно, по мере поступления таких заказов, выполняет их. ,) (т.е. только он работает с базой) Соотвественно приложение-клиент прилагается. Это сообщение отредактировал(а) vbCrLf - 5.5.2006, 12:48 |
|||
|
||||
| mihanik |
|
|||
![]() -=Белый Медведь=- ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4054 Регистрация: 24.4.2006 Где: г. Тверь Репутация: 11 Всего: 109 |
Какой, например? Посоветуй! |
|||
|
||||
| vbCrLf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.5.2006 Где: Севастополь Репутация: 1 Всего: 1 |
Ну в смысле написал бы на VB. Или у меня такое впечатление, что твой вопрос вообще не касается Visual Basic'a...
|
|||
|
||||
| mihanik |
|
|||
![]() -=Белый Медведь=- ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4054 Регистрация: 24.4.2006 Где: г. Тверь Репутация: 11 Всего: 109 |
Это понятно, что на VB. Я БД на VB программирую всего 3 недели... Каким образом будут общаться клиент и сервер? I have no idea... |
|||
|
||||
| vbCrLf |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.5.2006 Где: Севастополь Репутация: 1 Всего: 1 |
Во-первых, активно юзаем Microsoft Winsock Control 6.0 Серверная часть: Кидаем winsock на форму и называем его например просто W (Ненавижу длинные имена объектов и переменных, но это сугубо мое предпочтение). В свойствах ставим этому контролу индекс 0. Всё. дальше пришем код.
Так... с этим вроде всё понятно. Включив фантазию, здесь можно наворотить довольно много. А теперь... Клиентская часть: Опять кидаем контрол Winsock на форму, называем его W и пишем код. Да, самое главное! В глобале обьявляем две переменные: Dim Wait As Boolean Dim inMSG As String Онb нам пригодятся
Вот вроде и всё... Код писал не в VB, возможны ошибки Так же есть спецефические особенности контрола, их придёться обходить руками. Но суть я думаю понятна. Это сообщение отредактировал(а) vbCrLf - 5.5.2006, 17:50 |
||||||
|
|||||||
| mihanik |
|
|||
![]() -=Белый Медведь=- ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 4054 Регистрация: 24.4.2006 Где: г. Тверь Репутация: 11 Всего: 109 |
Изящно... Изящно...
На следующей неделе буду копать в этом направлении... Спасибо! |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: 12 Всего: 35 |
А может не будем огород городить и прислушаемся к совету Akina
Поставь нормальную СУБД, типа SQL Server, и он уж позаботится об блокировках, чтении записей и т.д. -------------------- Никогда не говори никогда |
|||
|
||||
| vbCrLf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.5.2006 Где: Севастополь Репутация: 1 Всего: 1 |
Как всегда....
Погрузившись в написание, забыл о самом главном. Недостаток кода в том, что во время его выполнения всё-равно не соблюдается ограничение одновременного доступа к ячейке... Вот предлагаю к рассмотрению модифицированный код серверной части программы. В глобале объявляем такой массив и парочку переменных: Dim Ops(99) As String Dim inOperation As Boolean Dim NewCMD As Boolean И далее....
|
|||
|
||||
| vbCrLf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.5.2006 Где: Севастополь Репутация: 1 Всего: 1 |
Простой пример создания сетевых клиент-сервер приложений на базе компонента MS WinSock Control 6.0
В данном примере реализуется передача текстовой строки серверу и получение строки от сервера. Присоединённый файл ( Кол-во скачиваний: 14 )
eXamle.zip 4,76 Kb |
|||
|
||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |