powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Блокирование записи у mdb
11 сообщений из 11, страница 1 из 1
Блокирование записи у mdb
    #37029408
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть проект VFP6.0-ODBC-mdb
Таблицы подвязаны через Remote Views...
Блокирование записи RLOCK() должно работать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Select newid
If Seek('request',"newid","cTable")
	If Rlock()
		_next_reg_num=newid.nextid
		Replace newid.nextid With newid.nextid+ 1 
		Unlock
	Endif
Endif
Похоже, что RLOCK() всегда возвращает .t. и нет гарантии, что _next_reg_num у двух пользователей будет разным
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029431
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работать не будет, VIEW - это копия данных из базы, причем у каждого своя.
RLOCK() будет работать только для DBF

Чем не устроил встроенный автоинкремент в MDB?
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029442
refregЕсть проект VFP6.0-ODBC-mdb
Таблицы подвязаны через Remote Views...
Блокирование записи RLOCK() должно работать?Все зависит от Вашего понимания действия этой функции и понимания принципа действия Remote ViewПохоже, что RLOCK() всегда возвращает .t. и нет гарантии, что _next_reg_num у двух пользователей будет разнымУгу. Ибо Remote View - это результат запроса. И блокировка накладывается на этот результат, который на локальной машине и который, разумеется, используется только Вами на локальной машине. То есть Вы совершенно не в ту сторону смотрите и совершенно неприемлемые для клиент-сервера методы используете.
На сервере клиент не может по своему усмотрению накладывать блокировки. Он не знает обстановки на сервере. Блокировками рулит сервер. При выполнении запросов.
Ваш способ генерации уникального идешника на клиенте - нонсенс.
Наверняка уже возникший вопрос - а как правильно? - тема достаточно обширная. И сильно зависит от архитектуры приложения. То есть сначала надо определиться с архитектурой, в которой можно будет использовать правильные методы. При этом имеющуюся сейчас архитектуру вместе с кодом, ее реализующим, придется отправить на помойку. Вы готовы к этому?
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029494
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЧем не устроил встроенный автоинкремент в MDB?Тем, что его менять нельзя. Вот от него и хотел избавиться. Как следствие - экспорт-импорт через одно место и еще много чего... Ладно, оставлю как есть пока - мне просто нужно было знать наверняка, что так НЕЛЬЗЯ...
проходящий.При этом имеющуюся сейчас архитектуру вместе с кодом, ее реализующим, придется отправить на помойку. Вы готовы к этому?Я то готов, и желание есть... Но, к сожалению, не все желания сбываются )

Спасибо.
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029566
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregDima TЧем не устроил встроенный автоинкремент в MDB?Тем, что его менять нельзя. Вот от него и хотел избавиться. Как следствие - экспорт-импорт через одно место и еще много чего... Ладно, оставлю как есть пока - мне просто нужно было знать наверняка, что так НЕЛЬЗЯ...
ВладимирМ тут пример приводил как сделать счетчик без установки блокировок, пример правда немного для другого, но можно модифицировать под твою задачу.
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029660
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя чего-то я все усложнил, в MDB вроде транзанкции есть, все гораздо проще через SQLEXEC()
Код: plaintext
1.
2.
3.
4.
text to lcQuery noshow textmerge
update newid set nextid = nextid +  1  where cTable = "request"
select nextid from newid  where cTable = "request"
endtext
SqlExec(lnHandle, lcQuery, 'nextid')
правда тут другие подводные камни начнутся из-за блокировок
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37029789
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно поступить так, как делают в старшей версии.
счетчик на стороне фокса не проставлять,
а метить каким-то доп.уникальным ключем.
после вставки новой записи, искать ее уже
по явному известному доп.ключу, и возвращать назад в фокс значение счетчика.
(описан принцип аторефреша ключевого поля в курсорадаптере.)
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37030865
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за варианты решения проблемы.
Сделал так, проверил на 3-х компах - вроде работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
k =  1 
Do While k<= 100 
	Select Request
	Requery()
	Calculate Max(reg_num) To _max_Reg_Num
	Insert Into Request (reg_num) Values (_max_Reg_Num+ 1 )
	_is_ok = Tableupdate()
	If _is_ok
		Exit
	Else
		Tablerevert()
	Endif
	k=k+ 1 
	=Inkey( 0 . 1 )
Enddo
If k>= 101 
	Messagebox("Сервер занят. Попробуйте позже...")
	Return
Endif
Посмотрите, насчет подводных камней...
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37030982
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, Вы же на стандартные "грабли" наступаете. Сделали именно так, как ни в коем случае делать нельзя. Думаете, зачем вообще блокировку пытаются наложить? Именно для того, чтобы между командами Calculate и TableUpdate другой пользователь не начал делать то же самое.

- Первый пользователь выполнил Calculate и получил, скажем, 1
- Второй пользователь выполнил Calculate и получил тот же 1
- Первый пользователь успешно записал 1
- Второй пользователь не менее успешно также записал 1

Вот и получили дубль.

Варианты, как это обойти Вам уже приводили. Как минимум, нужна отдельная таблица, которая будет хранить последнее использованное (или первое не использованное) значение счетчика.
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37030997
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

Забыл указать, что reg_num ключ в mdb. Когда второй пользователь будет писать, odbc сообщит о нарушении уникальности.
...
Рейтинг: 0 / 0
Блокирование записи у mdb
    #37031015
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregЗабыл указать, что reg_num ключ в mdb. Когда второй пользователь будет писать, odbc сообщит о нарушении уникальности.
Ну, так будет работать. Только медленно очень... Впрочем, это уже другой вопрос...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Блокирование записи у mdb
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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