Форум » [x]Harbour » DbrLock и DbrLockList » Ответить

DbrLock и DbrLockList

Dima: Что то я потерялся. [pre2] Use test shared new //test->(Dbgoto(1)) test->(Dbrlock(1)) //test->(Dbgoto(10)) test->(Dbrlock(10)) ? hb_valtoexp(test->(dbrlocklist())) [/pre2] Запустил одну копию программы и получил {1,10} Запустил вторую копию этой же проги и получаю пустой массив {} Почему ? Собственно нужно выяснить какие записи заблокированы. PS Похоже dbrlocklist работает не так как я хотел )

Ответов - 20

Dima: IsDbRLock( xRec ) будучи запущенным из другой копии с той же базой дает результат что запись не блокирована. Единственно что верно срабатывает это Rlock() , но мне же не нужно блокировать запись на самом деле а надо просто выяснить какие записи в локе.

Haz: Дима, эта проблема еще со времен клиппера тянется. Первые стоны прозвучали при работе в DOS сессии W95. Решения похоже нет, во всяком случае при обычной работе с DBF. В ADS можно корректно получить все блокировки SQL запросом, ну ты понимаешь что для этого нужно))) Ps. Можешь свою на базе dbeval нарисовать

Dima: Haz пишет: В ADS можно корректно получить все блокировки SQL запросом Каким ? Может есть аналог в rddads...


Dima: Вот эта вроде пашет ADSMGGETLOCKS , только с параметрами не до конца разобрался

Dima: Haz Вот так вроде заработало [pre2] aray:=ADSMGGETLOCKS(50,DBF+"onluser.dbf") if !empty(aray) if ascan(aray,recs)#0 ret:=.t. endif endif [/pre2]

Haz: Дим Сам нашел))) я был в спортзале, память уже не та и без шпаргалки никак. Только приехал. Завтра гляну еще .

Dima: Haz пишет: Сам нашел Не совсем Haz пишет: В ADS можно корректно получить все блокировки SQL запросом Залез в справку и пробил SP_ и поехал по списку в поисках локов , нашел 2 подходящие и стал смотреть Help по ним. После глянул чего есть в RDDADS. С параметрами вроде не ошибся , работает. PS И по ходу идея переместить базу в "ZERO SPACE" была полезной. Это защитило ее от Dbcloseall() которые я так часто люблю делать

Andrey: Всем привет ! Вот тоже полез заново разбираться с блокировкой записи. Вопрос возник такой: Если делаешь раз блокировку записи (cAls)->(DBUnlock()) нужно ли после неё делать (cAls)->(DbCommit()) ? Если не делать, то чем это грозит ? Не совсем понял описание функции - IsLocked( [<nRecno>] ) --> lIsLocked Description IsLocked() tests if a database record is currently locked for write access by this process. It cannot detect, if a record lock is set by another process IsLocked () проверяет, заблокирована ли в данный момент запись базы данных для доступа на запись этим процессом. Он не может определить, установлена ли блокировка записи другим процессом Или это так переводчик переводит ?

Andrey: Кажись понял на тестовой программе. Из другой программы определить нельзя, блокирована ли запись или нет. Блин и как тогда определить блокирована ли запись или нет ? Опять через семафорный файл как в терминалке делать ? Есть ли другие решения ?

PSP: Andrey пишет: Есть ли другие решения ? dbRLock() возвращает значение. https://www.itlnet.net/programming/program/Reference/c53g01c/ng2e977.html

Andrey: [pre2] DBRLOCK () - это функция базы данных, которая блокирует запись, идентифицированную значение <xIdentity>. В Xbase <xIdentity> - это номер записи. Если вы не укажете <xIdentity>, все блокировки записи будут сняты, а текущая запись заблокирована. Если вы укажете <xIdentity>, DBRLOCK () пытается заблокировать его и, в случае успеха, добавляет его в заблокированную запись список.[/pre2] Т.е. нужно переделывать все блокировки (cAlias)->(RLock()) на эту новую функцию ? И тогда можно будет из другой программы что запись заблокирована другим процессом ?

PSP: Определить, заблокирована ли запись или нет, можно как-то так: IF dbRLock() ... ELSE ? "Запись заблокирована" END

Andrey: PSP пишет: Определить, заблокирована ли запись или нет, можно как-то так: IF dbRLock() ... ELSE ? "Запись заблокирована" END А как же хелп ? Если вы не укажете <xIdentity>, все блокировки записи будут сняты, а текущая запись заблокирована. Если вы укажете <xIdentity>, DBRLOCK () пытается заблокировать его и, в случае успеха, добавляет его в заблокированную запись список. Т.е. я при проверке сам и заблокирую эту запись.

PSP: Если запись заблокирована другим процессом, то dbRLock() вернёт .F. в любом случае. Параметр служит для указания номера записи, которую нужно заблокировать. Если параметра нет, то производится попытка блокировки текущей записи, а блокировка других записей (если такие есть) текущего процесса снимается. Если параметр указан, то производится попытка блокировки записи, указанной параметром, но при этом эта запись добавляется в список заблокированных в текущем процессе. Определить же, заблокирована ли запись другим процессом, можно просто по возвращаемому значению dbRLock(). Если она вернула .F., то запись уже заблокирована в другом процессе.

PSP: Andrey пишет: Т.е. я при проверке сам и заблокирую эту запись Ну и что? Да, она заблокируется, но её ж можно тут же разблокировать, если требуется.

Andrey: PSP пишет: Ну и что? Да, она заблокируется, но её ж можно тут же разблокировать, если требуется. Понял. Спасибо !

Dima: Andrey пишет: Вопрос возник такой: Если делаешь раз блокировку записи (cAls)->(DBUnlock()) нужно ли после неё делать (cAls)->(DbCommit()) ? Уже обсуждали. В начале DbCommit после DBUnlock

Andrey: Dima пишет: Уже обсуждали. В начале DbCommit после DBUnlock Почему ? Везде в примерах сначала DBUnlock а потом DbCommit !

Dima: Andrey пишет: Везде в примерах сначала DBUnlock а потом DbCommit ! Делай как считаешь нужным Или читани темку http://clipper.borda.ru/?1-3-0-00000137-000-10001-0-1287163818

PSP: DBCOMMIT() Flush pending updates ------------------------------------------------------------------------------ Syntax DBCOMMIT() --> NIL Returns DBCOMMIT() always returns NIL. Description DBCOMMIT() causes all updates to the current work area to be written to disk. All updated database and index buffers are written to DOS and a DOS COMMIT request is issued for the database (.dbf) file and any index files associated with the work area. DBCOMMIT() performs the same function as the standard COMMIT command except that it operates only on the current work area. For more information, refer to the COMMIT command. Notes . Network environment: DBCOMMIT() makes database updates visible to other processes. To insure data integrity, issue DBCOMMIT() before an UNLOCK operation. For more information, refer to the "Network Programming" chapter in the Programming and Utilities Guide.



полная версия страницы