Автор | Сообщение |
|
| |
Пост N: 6313
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.17 16:40. Заголовок: DbrLock и DbrLockList
Что то я потерялся. Use test shared new //test->(Dbgoto(1)) test->(Dbrlock(1)) //test->(Dbgoto(10)) test->(Dbrlock(10)) ? hb_valtoexp(test->(dbrlocklist())) Запустил одну копию программы и получил {1,10} Запустил вторую копию этой же проги и получаю пустой массив {} Почему ? Собственно нужно выяснить какие записи заблокированы. PS Похоже dbrlocklist работает не так как я хотел )
|
|
|
Новых ответов нет
[см. все]
|
|
|
| |
Пост N: 6314
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.17 17:03. Заголовок: IsDbRLock( xRec ) бу..
IsDbRLock( xRec ) будучи запущенным из другой копии с той же базой дает результат что запись не блокирована. Единственно что верно срабатывает это Rlock() , но мне же не нужно блокировать запись на самом деле а надо просто выяснить какие записи в локе.
|
|
|
|
| |
Пост N: 1067
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.17 18:27. Заголовок: Дима, эта проблема ..
Дима, эта проблема еще со времен клиппера тянется. Первые стоны прозвучали при работе в DOS сессии W95. Решения похоже нет, во всяком случае при обычной работе с DBF. В ADS можно корректно получить все блокировки SQL запросом, ну ты понимаешь что для этого нужно))) Ps. Можешь свою на базе dbeval нарисовать
|
|
|
|
| |
Пост N: 6315
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.17 18:36. Заголовок: Haz пишет: В ADS м..
Haz пишет: цитата: | В ADS можно корректно получить все блокировки SQL запросом |
| Каким ? Может есть аналог в rddads...
|
|
|
|
| |
Пост N: 6316
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.17 18:51. Заголовок: Вот эта вроде пашет ..
Вот эта вроде пашет ADSMGGETLOCKS , только с параметрами не до конца разобрался
|
|
|
|
| |
Пост N: 6317
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.17 19:05. Заголовок: Haz Вот так вроде з..
Haz Вот так вроде заработало aray:=ADSMGGETLOCKS(50,DBF+"onluser.dbf") if !empty(aray) if ascan(aray,recs)#0 ret:=.t. endif endif
|
|
|
|
| |
Пост N: 1068
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.03.17 00:17. Заголовок: Дим Сам нашел))) я ..
Дим Сам нашел))) я был в спортзале, память уже не та и без шпаргалки никак. Только приехал. Завтра гляну еще .
|
|
|
|
| |
Пост N: 6318
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.17 09:30. Заголовок: Haz пишет: Сам наше..
Haz пишет: Не совсем Haz пишет: цитата: | В ADS можно корректно получить все блокировки SQL запросом |
| Залез в справку и пробил SP_ и поехал по списку в поисках локов , нашел 2 подходящие и стал смотреть Help по ним. После глянул чего есть в RDDADS. С параметрами вроде не ошибся , работает. PS И по ходу идея переместить базу в "ZERO SPACE" была полезной. Это защитило ее от Dbcloseall() которые я так часто люблю делать
|
|
|
|
| постоянный участник
|
Пост N: 6363
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.19 14:34. Заголовок: Всем привет ! Вот то..
Всем привет ! Вот тоже полез заново разбираться с блокировкой записи. Вопрос возник такой: Если делаешь раз блокировку записи (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 () проверяет, заблокирована ли в данный момент запись базы данных для доступа на запись этим процессом. Он не может определить, установлена ли блокировка записи другим процессом Или это так переводчик переводит ?
|
|
|
|
| постоянный участник
|
Пост N: 6364
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.19 15:47. Заголовок: Кажись понял на тест..
Кажись понял на тестовой программе. Из другой программы определить нельзя, блокирована ли запись или нет. Блин и как тогда определить блокирована ли запись или нет ? Опять через семафорный файл как в терминалке делать ? Есть ли другие решения ?
|
|
|
|
| постоянный участник
|
Пост N: 1537
Зарегистрирован: 27.01.07
|
|
Отправлено: 26.07.19 16:12. Заголовок: Andrey пишет: Есть ..
|
|
|
|
| постоянный участник
|
Пост N: 6365
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.19 16:59. Заголовок: DBRLOCK () - это ..
DBRLOCK () - это функция базы данных, которая блокирует запись, идентифицированную значение <xIdentity>. В Xbase <xIdentity> - это номер записи. Если вы не укажете <xIdentity>, все блокировки записи будут сняты, а текущая запись заблокирована. Если вы укажете <xIdentity>, DBRLOCK () пытается заблокировать его и, в случае успеха, добавляет его в заблокированную запись список. Т.е. нужно переделывать все блокировки (cAlias)->(RLock()) на эту новую функцию ? И тогда можно будет из другой программы что запись заблокирована другим процессом ?
|
|
|
|
|
| постоянный участник
|
Пост N: 1538
Зарегистрирован: 27.01.07
|
|
Отправлено: 26.07.19 17:47. Заголовок: Определить, заблокир..
Определить, заблокирована ли запись или нет, можно как-то так: IF dbRLock() ... ELSE ? "Запись заблокирована" END
|
|
|
|
| постоянный участник
|
Пост N: 6366
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.19 17:51. Заголовок: PSP пишет: Определи..
PSP пишет: цитата: | Определить, заблокирована ли запись или нет, можно как-то так: IF dbRLock() ... ELSE ? "Запись заблокирована" END |
| А как же хелп ? Если вы не укажете <xIdentity>, все блокировки записи будут сняты, а текущая запись заблокирована. Если вы укажете <xIdentity>, DBRLOCK () пытается заблокировать его и, в случае успеха, добавляет его в заблокированную запись список. Т.е. я при проверке сам и заблокирую эту запись.
|
|
|
|
| постоянный участник
|
Пост N: 1540
Зарегистрирован: 27.01.07
|
|
Отправлено: 26.07.19 18:01. Заголовок: Если запись заблокир..
Если запись заблокирована другим процессом, то dbRLock() вернёт .F. в любом случае. Параметр служит для указания номера записи, которую нужно заблокировать. Если параметра нет, то производится попытка блокировки текущей записи, а блокировка других записей (если такие есть) текущего процесса снимается. Если параметр указан, то производится попытка блокировки записи, указанной параметром, но при этом эта запись добавляется в список заблокированных в текущем процессе. Определить же, заблокирована ли запись другим процессом, можно просто по возвращаемому значению dbRLock(). Если она вернула .F., то запись уже заблокирована в другом процессе.
|
|
|
|
| постоянный участник
|
Пост N: 1541
Зарегистрирован: 27.01.07
|
|
Отправлено: 26.07.19 18:06. Заголовок: Andrey пишет: Т.е. ..
Andrey пишет: цитата: | Т.е. я при проверке сам и заблокирую эту запись |
| Ну и что? Да, она заблокируется, но её ж можно тут же разблокировать, если требуется.
|
|
|
|
| постоянный участник
|
Пост N: 6367
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.19 18:55. Заголовок: PSP пишет: Ну и что..
PSP пишет: цитата: | Ну и что? Да, она заблокируется, но её ж можно тут же разблокировать, если требуется. |
| Понял. Спасибо !
|
|
|
|
| |
Пост N: 7078
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.07.19 21:05. Заголовок: Andrey пишет: Вопро..
Andrey пишет: цитата: | Вопрос возник такой: Если делаешь раз блокировку записи (cAls)->(DBUnlock()) нужно ли после неё делать (cAls)->(DbCommit()) ? |
| Уже обсуждали. В начале DbCommit после DBUnlock
|
|
|
|
| постоянный участник
|
Пост N: 6368
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.19 14:43. Заголовок: Dima пишет: Уже обс..
Dima пишет: цитата: | Уже обсуждали. В начале DbCommit после DBUnlock |
| Почему ? Везде в примерах сначала DBUnlock а потом DbCommit !
|
|
|
|
| |
Пост N: 7079
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.07.19 15:31. Заголовок: Andrey пишет: Везде..
|
|
|
|
| постоянный участник
|
Пост N: 1542
Зарегистрирован: 27.01.07
|
|
Отправлено: 27.07.19 15:32. Заголовок: DBCOMMIT() Flush pe..
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.
|
|
|
|