Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с вопросом по блокировкам!!! / 22 сообщений из 22, страница 1 из 1
09.05.2004, 12:36
    #32511675
BigTaur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Привет всем! Надо сделать сетевое приложение. Поставить всякие там блокировки! Блокирую запись RLOCK(). Вопрос: В 1 экземпляре приложения, в котором запись блокируется, ISRLOCKED() отрабатывает нормально, а во 2 экземпляре оно говорит .F., а при попытке изменить выдается системное сообщение "Запись блокирована другим пользователем"! А хотелось бы свое!!!
DataSession: Default, Buffermode: Pessimistic Record?
...
Рейтинг: 0 / 0
09.05.2004, 17:55
    #32511756
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Вот когда ISRLOCKED выдает .F. и надо выдать сообщение о невозможности блокирования и изменения и отказатся от дальнейших действий по изменению
...
Рейтинг: 0 / 0
09.05.2004, 21:12
    #32511793
G0b1in
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
В сетевом приложении команды ZAP, PACK, REINDEX считать матерными :-D
...
Рейтинг: 0 / 0
10.05.2004, 04:04
    #32511859
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
ISRLOCKED() - это вообще не для проверки блокировок другого пользователя!!!
Rlock() и только...
...
Рейтинг: 0 / 0
11.05.2004, 07:20
    #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
11.05.2004, 09:47
    #32512602
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Не, неправильно ;-)

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

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

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

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

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

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

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

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

TableUpdate(.F.,.T.)
ENDIF
...
Рейтинг: 0 / 0
14.05.2004, 09:02
    #32517304
zzzzzzz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Уважаемый ВладимирМ, поскольку мне как-то не приходилось пользоваться блокировкаси и тэйблипдейтом (ну не профи я...)
нельзя ли десяток строчек кода в пример....
блокировку на форме ставлю оптимистическую.. а код под кнопкой сохранить приведите будьте добры... вкратце...
где инсерт или апдэей в таблице, а где тэйблапдэйт....
Буду весьма признателен!!!
...
Рейтинг: 0 / 0
14.05.2004, 09:03
    #32517308
zzzzzzz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
блин столько опечаток... и НЕ блокировку а буфферизацию оптимистическую... сорри!!!
...
Рейтинг: 0 / 0
14.05.2004, 10:46
    #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
14.05.2004, 11:29
    #32517587
zZzZz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
ВладимирМ - Огромное спасибо!!!!
...
Рейтинг: 0 / 0
14.05.2004, 11:32
    #32517597
zzzzzz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Один авопрос!!!
Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере?
...
Рейтинг: 0 / 0
14.05.2004, 12:01
    #32517690
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вопросом по блокировкам!!!
Датасессия на форме, в которой редактируется запись какая должна быть в Вашем примере?

Без разницы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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