Форум » [x]Harbour » Совместно открытые файлы. Использование блокировки индекса на чтение. » Ответить

Совместно открытые файлы. Использование блокировки индекса на чтение.

Andrey: Pasha: 3. Выборки из файла можно выполнять так: dbOrderInfo(DBOI_READLOCK,,, .t.) dbSeek(..) while ... if ... endif skip enddo dbOrderInfo(DBOI_READLOCK,,, .f.) Это блокировка индекса на чтение. Она выполняется всегда при любой навигавии по таблице, т.е. в операциях seek/skip/goto Если выборка состоит из 100 строк, то блокировка/разблокировка будет выполняться 100 раз, и выборка будет тормозить. Если блокировку сделать перед выборкой, то выборка будет выполняться быстро. Но злоупотреблять READLOCK не стоит, поскольку на время блокировки эти данные недоступны для чтения с других станций. А как будет выглядеть эта недоступность ? Будет вылет программы или еще чего нибудь ? Т.е. хотелось бы что другой юзер при блокировки получал бы сообщение типа: "Данные заняты ! Подождите, пока идет расчет !" . Это придется делать самостоятельно или можно получить какую-нибудь через функцию: блокирован индекс или нет ?

Ответов - 8

Pasha: На время блокировки на другой станции будет задержка при навигации по той же таблице. Это задержка в любом случае есть, так как блокировка на чтение выполняется всегда. Сообщение выдавать не получится. Меня тоже, когда пришлось использовать READLOCK, беспокоил вопрос, насколько такой способ будет мешать рабете других станций. Конечно, надо выполнять определенные правила. Выборка с READLOCK должна быть простой, т.е. внутри нее не должно быть выборок из других таблиц. Ну без фанатизма конечно, если выбирается очеть большой обьем данных, READLOCK использовать не надо. Я делал тесты. Но в реальной работе пользователей неблагопиятных последствий не было.

Andrey: Спасибо БОЛЬШОЕ Pasha ! Буду пробовать !

Pasha: Я неправильно написал. Если индекс заблокирован для чтения, то для других рабочих станций будет недоступна операция записи по индексу, а не чтение.


Dima: что то я не вижу практического применения READLOCK в сетевой задаче , коли для других рабочих станций будет недоступна операция записи по индексу. для локальной задачи это то что надо.

Pasha: В момент чтения данных с одной р.с. операция записи на другой в любом случае недоступна. Речь идет о том, что на блокировку/снятие блокировки тратится время, и множество таких блокировок/снятий замедляет работу Если блокировать один раз перед выборкой, то выборка выполняется намного быстрее

Dima: То есть если в этом режиме кто то строит отчет который строится (условно) 1 минуту , это значит что на другой рабочей станции использующей те же базы и индексы пользователь не сможет провести какой то документ (пишущий в те же базы) в течении 1 минуты ?

Pasha: Если поставить такую блокировку на чтение, то да Но речь идет о блокировке индекса

Dima: Pasha пишет: Но речь идет о блокировке индекса То есть база обновится а индекс нет до тех пор пока станция его залочившая не даст dbOrderInfo(DBOI_READLOCK,,, .f.) , так ?



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