Akupaka
Ну да, больше там проблем нет) Только эта, зато какая =)
Моё предложение. Внимательно читаем и ищем дыры:
Есть БД "Блокиратор", которая лежит на одном сервере (X). Есть БД "Приложение", которая лежит на куче серверов (Y1, Y2...). Все сервера Y могу коннектиться к серверу X
Каждый документ привязан к какому-то серверу. Каждый документ может быть залочен на привязанном сервере каким-либо пользователем. Всё это знает БД "Блокиратор".
Итак, нам нужно отредактировать документ на сервере Y1. Мы посылаем запрос в БД "Блокиратор".
Обработка запроса на блокировку документа на сервере Y1 (всё делает БД "Блокиратор")
1. Проверяем, к какому серверу в данный момент привязан документ (doc1 в БД "Блокиратор"). Если не к серверу Y1 - отказ с описанием ошибки
2. Проверяем, не заблокирован документ на сервере Y1 (doc1 в БД "Блокиратор"). Если заблокирован - отказ с описанием ошибки
3. Последняя проверка. Смысл её в том, чтобы узнать, прошла ли репликации с момента перевода заявки с сервера Y2 на Y1.
Открываем документ на сервере Y1 и смотрим содержимое поля Main_Server. Если Main_Server != "Y1", то репликация ещё не прошла - выдаем ошибку
Если ошибку не выдали, то блокируем документ и возвращаем true
Мы попытались отредактировать документ на сервере Y2 и получили ошибку, что документ привязан к серверу Y1. Нам было предложено открыть документ на сервере Y1, но нам проще изменить сервер документа (т.е. переключить документ на сервер Y2). Посылаем запрос в БД "Блокиратор"
Обработка запроса на изменение сервера документа с Y1 на Y2 (всё делает БД "Блокиратор")
1. Пытаемся заблокировать документ на сервере Y1. Если получаем ошибку, то выдаем её и выходим
2. Изменяем поле "Main_Server" в документе на сервере Y1: FIELD Main_Server := "Y2"
3. Изменяем в БД "Блокиратор" на сервер Y2 (документ doc1)
Повторяю, смотрим, ищим дыры, комментируем...