powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / RLOCK / LOCK
9 сообщений из 9, страница 1 из 1
RLOCK / LOCK
    #35105158
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вопрос, нужно временно заблокировать одну запись / поле чтобы можно было записать в нее значение и успеть его считать, так чтобы кто-то в сети за это промежуток времени, хоть и очень малый, не успел перебить это значение (вопрос уникальности ключей и интенсиивная работа одновремменых устройств.)
LOCK / RLOCK даже при успешной блокировке, разрешают почему-то делать Update..
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
update ждет освобождения записи. Проблема вероятно в том что чтение происходит до блокировки и update пишет что-то производное от прочитанного. Блокировка чтение не блокирует, только запись.
Например порядок такой:
1. Прочитать значение
2. заблокировать запись
3. изменить значение на +1
4. разблокировать

то при одновременном выполнении два разных пользователя выполнят одно и то же. Прочитают одновременно, а запишут по очереди. Т.е. вместо +2 окажется +1
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105218
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжая не законченную фразу, надо изменить последовательность действий:

1. Попытаться заблокировать запись
2. Если удалось заблокировать, читаем и изменяем значение
3. Снимаем блокировку.

Т.е. читать не ДО, а ПОСЛЕ успешной блокировки
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105327
И. В. К.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте буферизацию и requery()
получите сброс информации и одновременно считывание
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105336
И. В. К.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы поменял порядок

автор1. Прочитать значение
2. заблокировать запись
3. изменить значение на +1
4. разблокировать

сделал бы так:

1.заблокировать запись
2.Прочитать значение
3. изменить значение на +1
4. разблокировать
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105339
И. В. К.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПродолжая не законченную фразу, надо изменить последовательность действий:

1. Попытаться заблокировать запись
2. Если удалось заблокировать, читаем и изменяем значение
3. Снимаем блокировку.

Т.е. читать не ДО, а ПОСЛЕ успешной блокировки

упс..
экскьюзми
уже поменяли..
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105353
И. В. К.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс..
база фоксовая.. requ() не покатит..
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105513
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, можно и без явных блокировок, но в этом случае придется ставить бесконечный цикл именно на случай изменения значений другим пользователем. Если написать код "в чистом виде", то это будет примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
* Организуем бесконечный цикл
DO WHILE .T.
	* Отбираем нужную запись по ключу
	SELECT * FROM MyTab INTO CURSOR curValue NOFILTER WHERE Key = ...
	* Сохраняем текущее значение
	lnPrevValue = curValue.Value
	* Формируем новое значение
	lnNewValue = m.lnPrevValue +  1 
	* Пытаемся записать
	UPDATE MyTab SET Value=m.lnNewValue WHER Key=... AND Value=m.lnPrevValue
	IF _TALLY =  1 
		* Если удалось сделать запись прерываем цикл
		EXIT
	ENDIF
	* Запись сделать не удалось, повторяем все заново
ENDDO

Смысл в том, что в команде UPDATE-SQL модифицируется не просто запись с нужным значением ключа, но и с тем значением изменяемого поля, которое было прочитано изначально. До модификации.

Если такой записи нет (_TALLY=0), то это значит, что запись была изменена другим пользователем именно в промежуток между считыванием старого значения и его модификацией. В этом случае повторяем операцию.
...
Рейтинг: 0 / 0
RLOCK / LOCK
    #35105661
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМВ принципе, можно и без явных блокировок, но в этом случае придется ставить бесконечный цикл ...
Красивое решение, но я бы еще одну проверку добавил, чтобы не зациклилось случайно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	...
	SELECT * FROM MyTab INTO CURSOR curValue NOFILTER WHERE Key = ...
	if _TALLY !=  1 
		MessageBox("Косяк")
		exit
	endif
	...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / RLOCK / LOCK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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