powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с вопросом по блокировкам!!!
22 сообщений из 22, страница 1 из 1
Помогите с вопросом по блокировкам!!!
    #32511675
BigTaur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем! Надо сделать сетевое приложение. Поставить всякие там блокировки! Блокирую запись RLOCK(). Вопрос: В 1 экземпляре приложения, в котором запись блокируется, ISRLOCKED() отрабатывает нормально, а во 2 экземпляре оно говорит .F., а при попытке изменить выдается системное сообщение "Запись блокирована другим пользователем"! А хотелось бы свое!!!
DataSession: Default, Buffermode: Pessimistic Record?
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32511756
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот когда ISRLOCKED выдает .F. и надо выдать сообщение о невозможности блокирования и изменения и отказатся от дальнейших действий по изменению
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32511793
Фотография G0b1in
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В сетевом приложении команды ZAP, PACK, REINDEX считать матерными :-D
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32511859
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ISRLOCKED() - это вообще не для проверки блокировок другого пользователя!!!
Rlock() и только...
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32512492
BigTaur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BurnВот когда ISRLOCKED выдает .F. и надо выдать сообщение о невозможности блокирования и изменения и отказатся от дальнейших действий по изменению

Я что неправильно порчитал???
ISRLOCKED( ) returns a logical true (.T.) if the record is locked by the current application; otherwise a logical false (.F.) is returned.

Note ISRLOCKED() only returns .T. at the workstation that applied the record lock.

by the current application - или только в текущем приложении???
А .F. она всегда возращает если и не блокирована!!!

MaestroEv Rlock() и только...
А вот это оно!!! Спасибо! Только надо кол-во попыток ограничивать!
И как я сам не додумался!!!

IF RLOCK()
DO FORM addKlient WITH 2,RECNO("klient")
ELSE
MESSAGEBOX("Запись блокирована другим пользователем",64,"Сообщение")
ENDIF

Я все правильно осмыслил?
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32512602
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, неправильно ;-)

Потому что грубо это - блокировать все время, пока открыта форма на редактирование. Блокировать надо только на этапе записи изменений в таблицы. Правда, при этом геморроя с отслеживанием действий, возможно проведенных над записью параллельно другими пользователями, больше.

А так - в предложенном коде не хватает unlock перед else.

Ну а форма addKlient должна
1. работать с default datasession и
2. работать модально.
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32512605
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так точно.
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32516798
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все еще хуже.... Как говорит мой учитель, а он многого достиг (он сейчас в Англии) - "Не нужно делать блокировок там где Fox и без вас знает, что ему делать..."

То есть блокировать нужно только интерфейсные места, где можно явно наткнуться друг на друга и различные счетчики, а остальное Fox разрулит...наверное...

А вот про блокировки интерфейса написано много... И как ни делай - все
равно плохо... Нужно просто к этому привыкнуть... И приучить Юзверей.
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32516926
zzzzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
конечно приводить пример работы форм, созданных визардом я и сам считаю плохим тоном, но они-то как раз блокируют запись на время работы формы в режиме редактирования... может это и плохо (если юзер ушел покурить) но в другом случае, как отслеживать не поменял-ли кто другой данные пока я их меняю... геморр...
хотя лично я в своих проджектах блокирую транзакцией на момент сброса данных в таблицы... естестеввно если нас 3-е редактировало - то тот кто последний сбросил - тот и прав.. плохо ну да что поделать.... лень...
кстати явно через РЛОК я не делаю... приватная датасешн и на кнопке СОХРАНИТЬ навешена транзакция..... пока не завершена другой не сбросит... грубо согласен... при работе 5-6 юзеров не тестил...
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517109
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как отслеживать не поменял-ли кто другой данные пока я их меняю

Существует такая вещь, как оптимистическая буферизация и второй параметр в команде TableUpdate()

* Пользователь завершил редактирование в режиме оптимистической буферизации и нажал кнопку "Сохранить"

IF TableUpdate(.F.,.F.)=.F.
* Пока пользователь курил, другим пользователем были изменены те же данные.
* Деламе дополнительный запрос пользователю и если он решил писать поверх

TableUpdate(.F.,.T.)
ENDIF
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517304
zzzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый ВладимирМ, поскольку мне как-то не приходилось пользоваться блокировкаси и тэйблипдейтом (ну не профи я...)
нельзя ли десяток строчек кода в пример....
блокировку на форме ставлю оптимистическую.. а код под кнопкой сохранить приведите будьте добры... вкратце...
где инсерт или апдэей в таблице, а где тэйблапдэйт....
Буду весьма признателен!!!
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517308
zzzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин столько опечаток... и НЕ блокировку а буфферизацию оптимистическую... сорри!!!
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517460
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на таблицу установлен любой режим буферизации, то любые модификации производятся не сразу с таблицей, а записываются в некий "буфер".

Т.е. ты выполняешь все обычные команды по модификации (INSERT-SQL, REPLACE, UPDATE-SQL), но они модифицируют не непосредственно исходную таблицу, а ее буфер.

В режиме строковой буферизации (2 или 3) сброс буфера происходит:

-) По команде TableUpdate()
-) При переходе на другую запись
-) При закрытии таблицы

В режиме табличной буферизации (4 или 5) сброс буфера происходит

-) Только по команде TableUpdate() и никак иначе

Откат внесенных в буфер изменений и очистка буфера происходит по команде TableRevert()

Это значит, что при установленном режиме буферизации ты работаешь с таблицами как обычно. Однако чтобы внесенные изменения попали в исходную таблицу необходимо сбросить буфер этой таблицы.

Проверить факт модификации данных при табличной буферизации можно по команде GetNextModified(), а в пределах одной записи по GetFldState().

При работе в режиме табличной буферизации следует иметь в виду, что сброс буфера осуществляется по одной строке за раз. Это значит, что если в процессе сброса буфера произойдет ошибка, то хотя выполнение команды TableUpdate() будет прервано, но тем не менее все ранее сброшенные данные (сброшенные ДО возникновения ошибки) попадут в итоговую таблицу.

Как следствие, если предполагается сброс более одной записи, то команду TableUpdate() следует окружать транзакцией.

Если в процессе сброса буфера по команде TableUpdate() произошла ошибка, то никакого сообщения об ошибке не появится. Просто команда TableUpdate() вернет .F. Анализ причины ошибки следует выполнить при помощи функции AERROR().

Итого, примерный код кнопки "Сохранить" в режиме оптимистической табличной буферизации (5)

Код: 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.
30.
31.
32.
LOCAL llSuccess, lcMessageText, laError( 1 ), llOverWrite, llExit
llOverWrite = .F.
llExit = .F.
DO WHILE llExit = .F.
	* Предполагаю что будет только один шаг цикла
	llExit = .T.
	BEGIN TRANSACTION
	llSuccess = TableUpdate(.T.,m.llOverWrite,"MyTable")
	IF llSuccess=.T.
		END TRANSACTION
	ELSE
		* Немедленный откат изменений
		ROLLBACK
		* Анализ причины ошибки ПОСЛЕ отката
		=AERROR(laError)
		IF laError[ 1 , 1 ]= 1585 
			lcMessageText = "Пока Вы вносили изменения другим пользователем "+;
			"были изменены те же самые данные. Писать поверх внесенных изменений?"
			IF MessageBox(m.lcMessageBox,'Конфликт обновления', 4 + 32 + 256 )= 6 
				* Ответили "Да". Повторяю цикл сохранения, но уже с перезаписью
				llExit = .F.
				llOverWrite = .T.
				CONTINUE
			ELSE
				* Ответили "Нет". Действия по обновлению данных
			ENDIF
		ELSE
			lcMessageText = "В процессе сохранения произошла ошибка № "+;
					LTRIM(STR(laError[ 1 , 1 ]))+chr( 13 )+laError[ 1 , 2 ]
			MessageBox(m.lcMessageText,'Ошибка при сохранении', 0 + 48 )
		ENDIF
	ENDIF
ENDDO
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517587
zZzZz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ - Огромное спасибо!!!!
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517597
zzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один авопрос!!!
Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере?
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517690
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере?

Без разницы.

Private DataSession - это симуляция многопользовательского доступа для одного пользователя (с некоторыми ограничениями). Правда, я не проверял будет ли конфликт совместного доступа при одновременной правке в 2 формах одного приложения в Private DataSession. Но в одном приложении ты можешь организовать глобальный объект для отслеживания подобных ситуаций.

Если правка будет осуществлятся только в модальных формах, то ввобще никаких вопросов не возникнет.
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32517797
zZzZz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как раз имелось в виду, не редактирование в 2-3 одинаковых формах в пределах 1-го приложения.. а именно симуляция многопользовательской программы путем использования приватных сессий.....
то есть явно команды
use mytable in 5 shared
вообще нет.. форма "сама" в приватной сессии открывает
соответственно другой пользователь.. на другой машине тоже открывает ту же форму но из своего приложения...
Ваш вариант при этом должен работать?
Или все же лучше изменить подход и ЯВНО открывать таблицы???
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32518319
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
форма "сама" в приватной сессии открывает
Это Вам так кажется. Реально выполняются те же команды USE. Просто их не надо явно прописывать в коде.

Код написан из предположения, что данные правятся разными пользователями (или разными экземплярами программы на одном компьютере)

Да, в коде, разумеется, вместо слова CONTINUE надо написать LOOP. Опечатка
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32536077
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ
Код: plaintext
Итого, примерный код кнопки "Сохранить" в режиме оптимистической табличной буферизации ( 5 )

1)Уважаемый Владимир, скажите а какие изменения произойдут в приведенном коде для пессимистической буферизации таблицы(4), а также на Ваш взгляд нужна ли кнопка "Сохранить" при буферизации записей (2,3)?
2)По Вашему мнению какую буферизацию лучше(надежнее) использовать, я так понимаю это зависит прежде всего от размера таблицы?
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32536187
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1)Уважаемый Владимир, скажите а какие изменения произойдут в приведенном коде для пессимистической буферизации таблицы(4),

При пессимистической буферизации нет смысла во втором параметре в команде TableUpdate(). Т.е. ситуация, когда в процессе редактирования одним пользователем другой изменил те же самые записи в принципе невозможна. Следовательно, нет необходимости в цикле.

автора также на Ваш взгляд нужна ли кнопка "Сохранить" при буферизации записей (2,3)?

Зависит от того, как именно происходит редактирование - построчно (набор TextBox) или групами в Grid. Кроме того, следует уточнить постановку задачи. Возможно требуется автоматическое сохранение безо всяких кнопок.

автор2)По Вашему мнению какую буферизацию лучше(надежнее) использовать, я так понимаю это зависит прежде всего от размера таблицы?

Нет, это прежде всего зависит от постановки задачи.

При пессимистической буферизации - проблемы в момент начала внесения изменений. Но нет вопросов по одновременному редактированию двумя пользователями. Это просто невозможно. Однако есть серьезный риск "подвесить" все приложение, т.е. пока один пользователь редактирует данные никто другой вообще не сможет вносить изменения. Только просмотр.

При оптимистической буферизации - нет проблем начать вносить изменения, но есть проблемы в момент сохранения внесенных изменений.

При буферизации таблиц - нет проблем с сохранением внесенных изменений, поскольку этот процесс полностью управляется программистом.

При буферизации строк - есть проблемы с сохранением, поскольку в определенных ситуациях возможен автоматический сброс буфера.
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32536298
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!, я не перестаю поражаться как Вы можете доходчиво объяснять на казалось бы надоевшие, неоднократно повторяющиеся по смыслу вопросы!!!
Можно еще маленькие уточнения:
1) авторЗависит от того, как именно происходит редактирование - построчно (набор TextBox) или групами в Grid
Я правильно понимаю, что если идет редактирование для набора TextBox-ов, то лучше использовать буфферизацию записей, а если Grid - то табличную буфферизацию?
2)Пессимистическая буфферизация - это одно и тоже что если бы я на, допустим, нажатие кнопки формы "Редактировать" вставил RLOCK() [LOCK()],
т.е. при этой буфферизации происходит блокировка записи(таблицы)?
...
Рейтинг: 0 / 0
Помогите с вопросом по блокировкам!!!
    #32536362
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что если идет редактирование для набора TextBox-ов, то лучше использовать буфферизацию записей, а если Grid - то табличную буфферизацию?

Повторюсь. Это зависит от постановки задачи.

Если же говорить абстрактно, т.е. в некотором "общем случае", то да. Если за раз редактируется только одна строка, то логично использовать строковую буферизацию. Если же допустимо групповое редактирование нескольких строк "одновременно" или же в процессе редактирования одной строки необходимо перемещаться по таблице (поиск), то - табличную буферизацию

2)Пессимистическая буфферизация - это одно и тоже что если бы я на, допустим, нажатие кнопки формы "Редактировать" вставил RLOCK() [LOCK()],
т.е. при этой буфферизации происходит блокировка записи(таблицы)?

Да. Только если давая команды RLOCK() явно Вы можете проконтролировать факт их выполнения, то при пессимистической буферизации придется отлавливать сообщение об ошибке (ON ERROR или Form.Error())

Оптимистическая буферизация делает попытку заблокировать запись только в момент сброса буфера.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с вопросом по блокировкам!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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