powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Блокировка & буферизация (конкретный пример)
8 сообщений из 8, страница 1 из 1
Блокировка & буферизация (конкретный пример)
    #33510230
guast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть в БД таблица:
dt(дата) cnt(количество)

При нажатии кнопки на форме необходимо увеличить cnt определенной даты строго на единицу. Приложение многопользовательское.

Если я сделаю так, конфликтов наверное не будет...вроде как по досовской классике :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 SET REPROCESS TO AUTOMATIC 
  ...
   SEEK(MyDate, "Mytable",)
   IF RLOCK()
    	
    	REPLACE dt WITH dt+ 1 
    	UNLOCK
    ENDIF
  ENDIF
т.е. если один заблокировал запись то второй подождет пока она разблокируется и увеличит значение на 1

Ну вроде как в совремменом Visual программирование, я так понимаю, блокировки не приветствуются, так вот как мне б изменить код под "буферизацию"?
-Я так понимаю надо использовать пессимистическую на уровне строк?
-Тогда как сделать чтоб второй пользователь "ждал" пока первый изменит запись...как это происходит при буферизации?
-И вообще надо ли это в моем случае?...может по старинке вернее будет?
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33510491
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guast-Я так понимаю надо использовать пессимистическую на уровне строк?
-Тогда как сделать чтоб второй пользователь "ждал" пока первый изменит запись...как это происходит при буферизации?
-И вообще надо ли это в моем случае?...может по старинке вернее будет?те не сможешь второго пользоветеля заставить "ждать" пока первый изменит запись. ты можешь только получить знак, что не все измененные записи удалось обновить.

см. CURSORSETPROP("Buffering", ..), TABLECOMMIT(), TABLEREVERT(), BEGIN TRANSACTION, END TRANSACTION
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33510552
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно приблизительно так


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
    if Repl()
      .....
    else
      retu .f.
    endif

    ....




    func Repl   
    If Txnlevel()< 5 
       local llSuccess
       SEEK(MyDate, "Mytable")
       if foun( "Mytable")
          begin trans   
          try	
              REPLACE dt WITH dt+ 1  in  "Mytable"
               llSuccess = .t.
          endtry
          if !llSuccess
            retu .f. 
          endif
          END TRANSACTION
       else
          retu .f.
       endif
    ENDIF
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33510558
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
изв. + Rollback конечно
там в ифе где рету фолс
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33510691
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторIf Txnlevel()<5

Думаю, здесь логическая ошибка.

Если изменение данных происходит в транзакции, то излишне накладывать ещё одну транзакцию, причем откат её НЕ приведёт к откату транзакций верхних уровней.
Так же она не нужна при условии что внешняя транзакция является 5-ым уровнем транзакции, тогда код не сработает корректно хотя все прочие условия выполнены.

Код: plaintext
1.
       SEEK(MyDate, "Mytable")
       if foun( "Mytable")

лишняя проверка на found(), поскольку используется ф-ия seek, которая возвращает успех поиска.
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33510842
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
If Txnlevel()<5

это для примера
как ограничеть по количеству запущенных транзакций

можно увеличить




согласен if seek()
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33512133
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guastПри нажатии кнопки на форме необходимо увеличить cnt определенной даты строго на единицу. Приложение многопользовательское.
Прежде, чем начать кодить, ответь на парочку вопросов:

Весь процесс модификации заключается именно в увеличении счетчика на 1? Или изменяется что-то еще? Какие-то другие поля? Если модифицируется несколько полей, то как долго (по времени) пользователь может размышлять над тем, что именно менять?

ПОСЛЕ увеличения счетчика на 1 другой пользователь может также увеличить этот счетчик еще на 1? Какое событие должно послужить сигналом к тому, что ДРУГОЙ пользователь теперь тоже может увеличить этот счетчик?


Понимаешь, сама постановка вопроса, мягко говоря, странная. ЗАЧЕМ тут вообще какие-то буферизации, транзакции? Просто REPLACE и все. Он сам все и заблокирует и снимет блокировку.

Т.е. в ТАКОЙ постановке ни о какой буферизации вообще речи не идет. Чистый DOS-подход.

Цель буферизации - это разделить процесс внесения изменений и процесс сохранения этих изменений.

Ну, как в программе Word. Ты сначала вводишь текст (это буфер) и только ПОТОМ нажимаешь кнопку "Сохранить", чтобы твои изменения были сохранены на диске. Есть ПРОЦЕСС изменения и ПРОЦЕСС сохранения.

А в твоей постановке нет этих 2 процессов. Есть один общий процесс изменения-сохранения. Нет места для буферизации. Ни для какой. Ни для оптимистической, ни для пессимистической.
...
Рейтинг: 0 / 0
Блокировка & буферизация (конкретный пример)
    #33514817
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi guast!

Пример абстрактный, и бессмысленный в такой постановке.

UPDATE Mytable SET cnt=cnt+1 WHERE dt = m.MyDate

по on error или другим обработчиком ошибок ловим всё что может случится -
начиная от отсутствия таблицы и заканчивая чужим "интеллектуальным" кодом
который повесил блокировку и держит её неограниченно долго.
если тебе надо не просто нарастить счётчик, но ещё и ПОЛУЧИТЬ его текущее
значение до изменения (т.е. вытащить cnt "наружу" команды обновления) - это
совсем другое дело - тут нужна блокировка, либо нужно создать цикл, в
котором снова и снова "запрашивать и обновлять" таблицу - до тех пор, пока
не получим "стабильный" результат - т.е. что обновление реально "обработало"
нужную нам запись (обычно одну), при этом никто не вмешался в процесс
"между" тем как мы вынули старое значение и попытались записать новое. На
этом принципе иногда строят NewID подобные процедуры - если явная блокировка
невозможна или очень нежелательна.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Блокировка & буферизация (конкретный пример)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]