Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 154

•  TDictionary Custom Sort  6 215

•  Fast Watermark Sources  6 015

•  3D Designer  8 911

•  Sik Screen Capture  6 350

•  Patch Maker  6 769

•  Айболит (remote control)  6 750

•  ListBox Drag & Drop  5 625

•  Доска для игры Реверси  96 186

•  Графические эффекты  6 970

•  Рисование по маске  6 240

•  Перетаскивание изображений  5 142

•  Canvas Drawing  5 510

•  Рисование Луны  5 212

•  Поворот изображения  4 761

•  Рисование стержней  3 366

•  Paint on Shape  2 620

•  Генератор кроссвордов  3 509

•  Головоломка Paletto  2 798

•  Теорема Монжа об окружностях  3 609

•  Пазл Numbrix  2 365

•  Заборы и коммивояжеры  3 046

•  Игра HIP  2 001

•  Игра Go (Го)  1 926

•  Симулятор лифта  2 283

•  Программа укладки плитки  1 987

•  Генератор лабиринта  2 441

•  Проверка числового ввода  2 123

•  HEX View  2 459

•  Физический маятник  2 078

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

При обращении клиента, к уже редактируемой записи другим клиентом, выдаётся сообщение


Ответ 1:

Самое дешевое решение - завести поле, в которое будет записываться ID usera перед началом операции.

Перед началом обновления данных выполняете следующее.
1. При старте программы каждому юзеру раздаете уникальный ID.
2. Перед началом обновления данных записываете ID в поле в и коммитете данные. После этого поле будет залочено для этого юзера.
3. Вносите изменения.
4. В блокирующее поле записываете 0 и коммитете.

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

Если не делать ничего подобного то запросто при многопользовательской работе можно получить
deadlock на сервере а есть не очень хорошо.

Ответ 2:

Так сделать нельзя. Можно по другому. Оцени критические ситуации и поставь проверку на триггер или еще лучше сделай 
с помощью CHECK.
Например: колличество на складе не может быть меньше 0 CHECK TOVAR_COUNT>0
Если один из клиентов изменил количество , а второй попытался снять больше чем есть на складе - то сервер выдаст 
ошибку, которую ты можешь обработать программой.

Очень хорошая книга по этой теме П.В. Шумаков - Дельфи 3 и разработка приложений баз данных.
После ее прочтения 80% твоих вопросов будут решены.

Ответ 3:

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

В начале критическую секцию необходимо объявить в составе класса или
отдельно:


SectionLock: TCriticalSection;

Затем:


procedure TForm1.FormCreate(Sender: TObject);
begin
  SectionLock := TCriticalSection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SectionLock.Free;
end;

Теперь при инициализации Вашего метода можно использовать SectionLock:


SectionLock.Acquire;
try
  DoSomething;
finally
  SectionLock.Release;
end;

// или

SectionLock.Enter;
try
  DoSomething;
finally
  SectionLock.Leave;
end;

Когда поток достигает критической секции, то все что заключено в этой секции перестает реагировать на любые внешние воздействия до момента выхода из критической секции. Теперь на попытку обращения к серверу другого клиента в качестве результата можно возвращать значение, которое будет идентифициороваться как "Занято". Например:


if Lock then
  "Ответ - занято"

SectionLock.Enter;
try
  Lock := True;
  DoSomething;
finally
  SectionLock.Leave;
  Lock := False;
end;

P.S. Что бы сервер мог одновременно реагировать на несколько запросов, его необходимо реализовать в СОМ технологии.





Похожие по теме исходники

Примеры работы с БД

Примеры оформления DBGrid

Пример использования DBGrid

База предприятий и менеджеров 0.99

 

Консольное DOS приложение

Работа с принтером

Локализация приложений




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте