Схеми блокувань у базах даних

При роботі з Базами Даних у многопользовательском режимі виникають ситуації, коли необхідно обмежити число звертаються користувачів до даних. Це робиться для того, щоб запобігти одночасне оновлення однієї і тієї ж записи, при глобальному оновлених даних або при технічному обслуговування самої Бази Даних.

Процесор Баз Даних забезпечує три рівні блокувань:


· Блокування Бази Даних. На цьому рівні блокування до Бази Даних може звертатися лише один користувач. Такий рівень блокування застосовується для глобальної зміни або оновлення даних або при технічному обслуговуванні Бази Даних-стиску;


· Блокування Таблиці. На цьому рівні блокування до таблиці може звертатися лише один користувач. Такий рівень блокування застосовується в тих випадках, коли необхідно обробити відразу кілька записів таблиці.


· Блокування сторінки. На цьому рівні до заблокованої сторінці може звертатися лише один користувач. Це найнижчий рівень блокування.


Блокування Бази Даних 


Блокірівка на рівні Бази Даних здійснюється присвоєнням властивості Exclusive, при відкритті БД, значення True. При використанні вами елемента керування Data, в його властивостях встановіть Exclusive = True . Якщо ж ви використовуєте об'єкт DAO, то при присвоєнні значення об'єкту db встановіть в True значення другого параметра методу OpenDatabase:

Set db = DBEngine.OpenDatabase(“C:Biblio.mdb”, True)


Коли База Даних заблокована таким чином, тодругіе користувачі не зможуть її відкрити. При спробі звернення до заблокованої Базі Даних ви отримаєте повідомлення:


“Couldn”t use “C:Biblio.mdb”; file already in use.”


"Неможливо використовувати" C: Biblio.mdb "; файл вже використовується"


Одночасно з цим генерується перехоплюється помилка – 3045, використовуючи яку ви можете завершити програму, яка звертається до заблокованої Базі Даних, тому що після виникнення помилки програма продовжує виконуватися, хоча База Даних так і не була відкрита.


При використанні елемента керування Data в обробник події Error вставляється наступний код:


Private Sub Data1_Error (DataErr As Integer, Response As Integer) 


If Err = 3045 Then 


MsgBox "Доступ до Бази Даних закритий. Повторіть запит через кілька хвилин." & _, VbCritical, "Data_Error"


End


End If


End Sub

При використанні об'єкта DAO в тій процедурі, де буде стояти код відкриття Бази Даних, вставляється обробник помилок:


On Error Goto ErrHandler


"Тут вставляється код відкриття БД і якщо виникає помилка – 3045, то вона
"Перехоплюється й обробляється


ErrHandler: 


If Err = 3045 Then 


MsgBox "Доступ до Бази Даних закритий. Повторіть запит Через кілька хвилин." & _, VbCritical, "Data_Error"


End


End If


Блокування Таблиці


Блокування на рівні таблиці застосовується при глобальні зміни в окремо взятій таблиці. Після того як ви проведете ваші зміни та закриєте цю таблицю, толкко тоді до неї отримають доступ інші користувачі. . При використанні вами елемента керування Data, в його властивостях встановіть Exclusive = False, для того, щоб користувачі мали доступ до Бази Даних, а свойствu Option надайте значення 3. Це призведе до томи, що обрана вами таблиця (наприклад Authors) буде відкрита з параметрами DenyWrite (1) і DenyRead (2), що забороняє іншим користувачам відкривати цю таблицю під час дії вашої програми. При спробі звернення до заблокованої таблиці ви отримаєте повідомлення:


"Couldn" t lock table "Authors"; currently in use by user "admin" on machine "USER-0000011660" "


"Неможливо зблокований таблицю" Authors ", тому що вона використовується адміністратором машини" USER-0000011660 ""


Одночасно з цим генерується перехоплюється помилка – 3265, використовуючи яку ви можете завершити програму, яка звертається до заблокованої таблиці, тому що після виникнення помилки програма продовжує виконуватися, хоча таблиця так і не була відкрита. При використанні елемента керування Data в обробник події Error вставляється наступний код, але попередньо доповнюючи попередній:


Private Sub Data1_Error (DataErr As Integer, Response As Integer)


Select Case Err


            Case 3045


MsgBox "Доступ до Бази Даних закритий. Повторіть запит Через кілька хвилин." & _, VbCritical, "Data_Error"


End


            Case 3265


MsgBox "Доступ до таблиці закритий. Повторіть запит через кілька хвилин." & _, VbCritical, "Data_Error"


End


End Select


End Sub


Якщо ж ви використовуєте об'єкт DAO, то при присвоєнні значення об'єкту db встановіть в False значення другого параметра методу OpenDatabase:

Set db = DBEngine.OpenDatabase(“C:Biblio.mdb”, False)


а, при присвоєнні значенні об'єкту Recordset:

Set rs = db.OpenRecordset ("Authors", dbOpenTable, dbDenyRead + dbDenyWrite)


Для перехоплення виникає помилки знову ставте код:


On Error Goto ErrHandler


"Тут вставляється код відкриття таблиці і якщо виникає помилка – 3265, то вона
"Перехоплюється й обробляється


ErrHandler:


If Err = 3265 Then


MsgBox "Доступ до таблиці закритий. Повторіть запит Через кілька хвилин." & _
 ,vbCritical, “Data_Error”


End


End If


Тут вказаний тільки обробник помилки відкриття блокованої таблиці, тому що Базу Даних ви можете відкрити в іншій процедурі, в відрізняє від елемента Data.


Увага! Якщо ви відкриєте додатку Access в той час, коли у вас стоїть блокування таблиці (під час роботи вашої програми), то дана таблиця відкривається без сповіщення вас діалоговим вікном про те, що таблиця заблокована. Але, при всьому бажанні ви не зможете зробити запис або провести редагування який або запису.


Блокування сторінки 


Самим нижньому рівнем блокування є рівень таблиці. Процесор Microsoft Jet автоматично встановлює блокування сторінки і не може контролюватися вашою програмою. Сторінка даних може содержатьнесколько записів, розмір його дорівнює 26 кб. Блокування сторінки означає блокіровкувсех записів, що знаходиться на цій сторінці. Якщо довжина запису – 512 байтів, то буде заблоковано 4 записи, а якщо 50 байтів то 40 записів. Точне число записів не можна заздалегідь ні визначити ні задати, тому що таблиця може містити видалені записи (які видаляються тільки під час ущільнення). Але, не дивлячись на це об'єкт Recordset має властивість LockEdits, яке позволяетуправлять сторінкової блокуванням з програми.


Блокування на рівні таблиці імеетдва режиму – песимістичний (LockEdits ю True) та оптимістичний (LockEdits = False). За замовчуванням встановлюється песимістична блокування.


Песимістична блокування блокує сторінку при виклику методів Edit і AddNew, і залишається заблокованою до тих пір поки не будетвиполнен метод Update або CancelUpdate. Протягом всього часу жодна програма не має доступу до заблікірованной сторінці.


Переваги. Забезпечується максимально возможнийуровень цілісності даних.
Недоліки
. Сторінка може бути заблокована протягом тривалого часу.


Оптимістична блокування блокує сторінку тільки при виклику методу Update. Це означає, що користувач викликає методи Edit і AddNew, виробляє дії з дсаннимі, і тільки в момент збереження поновлення процесор Microsoft Jet намагається заблокувати сторінку. Якщо все проходить успішно, то запис потрапляє в таблицю, але якщо виявиться, що цей запис вже була отредактірованна, то оновлення скасовується і користувач получаетсообщеніе про те, що дані були вже кимось змінені.


Переваги. Сторінка блокується на мінімально возвожное час, тен самим уменьшаетсячісло повідомлень про блокування.
Недоліки.
Може призвести до помилок блокування при одночасному редагуванні запису двома користувачами, коли вони будуть проводити оновлення.


Програмно це здійснюється наступним чином:


· Для елемента Data – Data1.Recordset.LockEdits = True (Або False);

· Для об'єкта DAO – rs.LockEdits = True (Або False);

При роботі з пессіместіческой та оптимістичною блокуванням використовується виклик Idle. Цей метод призупиняє виконання програми на Visual Basic на час обнавленія динамічних і статичних наборів, які були відкриті цією програмою. Виклик цього методу гарантує, що до вашої програми потраплять самі останні зміни в наборі даних.


Програмно це здійснюється наступним чином:


                        Rs.Update


                        DBEngine.Idle dbFreeLock"Зробити паузу


  


Ось і все.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*