C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как понять, что другим клиентом запись изменена?, ---
** avtoritet
Отправлено: 25.07.2005, 04:25


Не зарегистрирован







Hi!
Сервер МССКЛ 2000, TADOConnection, TADOQUery.
Задача такая:
code:
try{
QueryRaion->Edit();

QueryRaion->FieldByName("K_RAIONNAME")->Value = dtEditRaion-> Text;
QueryRaion->Post();

}catch(Exception &excep){

QueryRaion->Cancel();
ShowMessage(excep.Message);
}

Надо изменить запись, но эту запись уже изменил кто-то другой. В это случае я получаю сообщение (что-то типа, запись изменилась клиентом). У этого сообщения есть номер, как взять номер сообщение вообще?

Вдогонку: обновлять запрос в моей ситуации не резонно.
olegenty
Отправлено: 27.07.2005, 14:20


Ветеран

Группа: Модератор
Сообщений: 2412



как вариант: http://www.rsdn.ru/article/?157
** avtoritet
Отправлено: 28.07.2005, 02:34


Не зарегистрирован







to olegenty:
В этой статье я не нашел того что нужно. Или же плохо читал. Я ведь получаю текст ошибки через класс Exception, а мне бы не текст, а код этой ошибки как-то отловить, а потом текст немного изменит.

Вот вопросик еще назрел: Как мне сделать так, чтобы в клиент-приложение нельзя было изменять запись, если она запрошена несколькими клиент-приложениями. То есть, если у Васи в запросе есть запись, например, "Кукушка", то Вася не мог бы изменить ее на "Дятел" или удалить, так как у Пети тожы в запрос входит запись "Кукушка"?

Что-то бойду какую-то написал! Может кому-нибудь не понятно о чем я?
olegenty
Отправлено: 28.07.2005, 07:16


Ветеран

Группа: Модератор
Сообщений: 2412



Ну тогда ты много раз по десять невнимательно читал. Среднее звено тебе для этого и нужно. О чём идёт речь в статье.

Код же ошибки выбирай из реального класса ошибки.
AVC
Отправлено: 28.07.2005, 08:42


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Вот вопросик еще назрел: Как мне сделать так, чтобы в клиент-приложение нельзя было изменять запись, если она запрошена несколькими клиент-приложениями.

Если запись запрошена на просмотр, то, скорее всего, проще как написал olegenty (в условиях MSSQL где я слабо знаком с системой блокировок). А вообще это достигается инструкцией Select for Update.
Но вам действительно нужно именно это? Обычно нужно что бы два или более пользователя не могли одновременно изменять одну запись. Тогда почитайте об оптимистических и пессимистических блокировках.
olegenty
Отправлено: 28.07.2005, 10:29


Ветеран

Группа: Модератор
Сообщений: 2412



2 AVC — разве это приведёт к ошибке? просто все встанут в очередь... или Oracle даст остальным читать последнее подтверждённое состояние? в MSSQL тоже можно поэкспериментировать с хинтами и добиться такого эффекта, только
1. нет гарантии, что этот мегаумный сервер заблокирует всего одну запись, а не экстент/страницу/таблицу. он, гад, сам принимает это решение, и на соображения разработчика/пользователся кладёт с прибором. в его терминологии это называется "эскалация блокировок"
2. таки, запись будет заблокирована ВООБЩЕ, т.е. её и не прочитаешь, а встанешь в очередь до тех пор, пока либо её не отпустит заблокировавшее соединение (тут зависит от уровня изоляции транзакции, но для Read Committed будет именно так), либо отвалишься по таймауту.
avc*
Отправлено: 28.07.2005, 10:50


Не зарегистрирован







olegenty
QUOTE

разве это приведёт к ошибке? просто все встанут в очередь...

Что "это"? Непонял.

QUOTE

или Oracle даст остальным читать последнее подтверждённое состояние?

Именно так. Это начинается с уровня изолированности ReadCommited. А более низкие Oracl'у не нужны и он их не поддерживает.

Ты говорил у тебя есть Том Кайт. Посмотри главу 3 — у меня бежали слезы умиления, когда я её читал.
olegenty
Отправлено: 28.07.2005, 11:02


Ветеран

Группа: Модератор
Сообщений: 2412



2 AVC — под "это" понимается блокировка записи. ты уже ответил, что Oracle заблокирует только модификацию. MSSQL же заблокирует на ВСЁ, в том числе и на чтение. Такой вот он бодрый.
avc*
Отправлено: 28.07.2005, 11:09


Не зарегистрирован







Ну тогда только оптимистичная блокировка с немедленным завершением транзакции (с чего начали к тому и пришли), а я себе могу позволить и пессимистичную и в длительной транзакции. smile.gif
** avtoritet
Отправлено: 28.07.2005, 11:56


Не зарегистрирован







А почему бы не пессимистическую блокировку? Как юзер только начал редактиовать, так сразу другим на это дело шляпа? А вообще реально ли сделать так: Петя и Вася открыли себе два запроса. Обоим в запрос вошла запись "Кукушка", но никто, ни Вася ни Петя, не могут ее (именно "кукушку")отредактировать. Пока Вася не отключится или не вызовет запрос, куда не входит "Кукушка", Петя редактировать "Кукушку не может" и наоборот?
olegenty
Отправлено: 28.07.2005, 12:32


Ветеран

Группа: Модератор
Сообщений: 2412



да всё не так, на самом-то деле. приведу пример, как это у меня реализовано (не обязательно делать так, но противоречий не возникает)
1. Пользуюсь ТОЛЬКО клиентскими наборами данных.
2. Петя и Вася получают выборку, при этом к обоим попадает кукушка.
3. Оба начинают редактировать кукушку.
4. А дальше варианты развития событий.
4.1. "кукушка" — не ключевое поле, а только атрибут. кто-то из ребят подтвердил ввод первым, "кукушка" стала "соловьём". на время update MSSQL блокирует запись эксклюзивно, т.е. все остальные, кто что-то хочет от записи, ждут подтверждения/отката транзакции, вызвавшей эксклюзивную блокировку. кто-то из ребят — вторым. при этом его действие дождалось предыдущего изменения, а затем превратило "соловья" в "крокодильчика с крыльями". и все счастливы.
4.2. "кукушка" — ключевое поле. тогда всё повторяется, вот только тот, кто вторым пытался сделать изменение, получит сообшение, что запись изменена, либо удалена, и ничего не произойдёт. он просто будет вынужден перечитать выборку, чтобы увидеть реальный набор данных. (такая ситуация у меня невозможна, ключевые поля никогда не меняются)
avc*
Отправлено: 28.07.2005, 12:54


Не зарегистрирован







4.1 А я бы не превращал соловья в крокодильчика а дал бы второму возможность увидеть, что стало с кукушкой. (классика). Но это все зависит от алгоритма.
olegenty
Отправлено: 28.07.2005, 14:34


Ветеран

Группа: Модератор
Сообщений: 2412



угу, это я могу легко. но не делаю (не просили). но мне пофиг потому, что я имею свои мета-мета таблицы, где хранится вся инфа о действиях пользователей. и "откатиться" на "соловья" проблемы не составляет.
** avtoritet
Отправлено: 29.07.2005, 12:55


Не зарегистрирован







Вроде как разобрался. Olegenty не подскажешь как огранизовать такие вот мета-мета таблицы для слежки действий пользователя (я. как пониаю, обрабать их сервер?) или может в инете есть где что почитать.
olegenty
Отправлено: 29.07.2005, 13:19


Ветеран

Группа: Модератор
Сообщений: 2412



теория по ООБД — в самый раз. например вот тут: http://ooad.asf.ru/

я для этого использую четыре ключевых таблицы:

1. Класс (Class) — содержит идентификаторы и наименования классов
2. Экземпляр класса (Instance) — содержит идентификатор класса, идентификатор экземпляра класса и ряд полей, позволяющих оперировать данными текущего состояния
3. Действие пользователя (Action) — содержит идентификатор действия пользователя, идентификатор действия, которое каскадно привело к данному, идентификатор типа действия пользователя, время действия пользователя, идентификатор пользователя, наименование хоста, с которого это действие осуществлялось. Действия могут быть следующего типа
3.1 Вставка пользователем
3.2 Обновление пользователем
3.3 Удаление пользователем
3.4 Подтверждение
3.5 Откат
3.х — набор действий, которые каскадно приводят одному или нескольким из первых трёх.
4. Состояние экземпляра класса на этапе цикла существования (Cycle) — содержит идентификатор экземпляра класса, идентификатор состояния, идентификатор предыдущего состояния, идентификатор действия, приведшего к данному состоянию и ещё ряд избыточных полей для ускорения некторых выборок
5. Таблицы данных, которые содержат идентификаторы состояний экземпляров классов и все атрибуты, которыми эти классы характеризуются.

НО!!! использование подобной модели
1. Требует ОФИГЕНОЙ проработки структуры БД, иначе всё будет тормозить не по детски, что неприемлемо
2. Требует следования жестким правилам, ибо СВЯЗИ между объектами уже не реляционные, а на уровне хранимых процедур, и привести систему к нецелостному состоянию — пара пустяков.
AVC
Отправлено: 29.07.2005, 13:50


Ветеран

Группа: Модератор
Сообщений: 1583



Спасибо Oracl'у. Триггера уровня "строка" всех основных таблиц записывают старое состояние записи в такую-же таблицу схемы SPY и заполняют поля кто, когда, что сделал. Кто, когда создал запись — автозаполняемые поля основной схемы. Тормоза незаметны. Но в схеме SPY уже ни какой целостности, да это и не надо. По специфики предприятия основная операция модификации — Insert.
** avtoritet
Отправлено: 29.07.2005, 13:55


Не зарегистрирован







Спасибо всем, пойду по сылке по швыряю!
olegenty
Отправлено: 29.07.2005, 14:00


Ветеран

Группа: Модератор
Сообщений: 2412



твою мать!!! а я тут целую шнягу развёл, не один месяц потратил, чтобы всё это заработало... НО! MSSQL мне навязан сверху, это объективная реальность, данная в ощущении бесполезной работы sad.gif
** avtoritet
Отправлено: 30.07.2005, 05:29


Не зарегистрирован







то olegenty:
В каком смысле шнягу развел? МССКЛ не любишь?
olegenty
Отправлено: 30.07.2005, 06:45


Ветеран

Группа: Модератор
Сообщений: 2412



ну вот это отслеживание мне понадобилось, поскольку по ТЗ есть 2 типа пользователей: одни вводят, другие подтверждают ввод. т.е. объект вообще может находиться в нескольких целостных состояниях: последнее подтверждённое и текущее. при этом неподтверждённых состояний тоже может быть несколько, и проверяющий может подтвердить их, а может откатиться на любое из них. но тупиковые ветки неподтверждённых откаченных записей всё равно остаются в системе, для последующих разборов полётов. опять же, "просмотровые" пользователи видят ТОЛЬКО подтверждённые состояния. помимо прочего, ряд объектов не требуют проверки, поэтому всегда "автоподтверждаются", а ряд объектов вообще не нуждается в отслеживании (кодификаторы различные), поэтому хранятся "по старинке". ну и действия ранжируются. т.е. часть действий обязательно подтверждается всегда, независимо от того, с каким объектом производится работа. в основном это импорты.

поэтому, тут я зря о шняге, простой истории мне мало. но MSSQL не прсто не люблю — он меня от "раздражает" до "бесит", хотя теперь я с ним практически на "ты". вот отсюда и эмоции.
** avtoritet
Отправлено: 30.07.2005, 11:37


Не зарегистрирован







Меня тоже MSSQL бесит, потому что я с ним не на "ты"! Надеюсь это временно! Исправляюсь потихоньку

Вернуться в Работа с базами данных в C++Builder