converted to PDF by HupBaH9I
∙ Транзакції використовують дані. кешированниє в буфері транзакції. а не дані на диску. для того щоб використовувати найновіші дані.
∙ Транзакції не можуть переписати існуючий індексний файл за допомогою команди
∙ Транзакції можуть використовуватися тільки з таблицями. належать баз даних.
Якщо ви включили ручну блокування таблиці або файлу під час транзакції за допомогою функцій FLOCK () і RLOCK (). то необхідно обов'язково зняти блокування. Команда END TRANSACTION не зніме блокування.
У вкладених транзакцій команди ROLLBACK і END TRANSACTION працюють зі змінами. які відбулися після останньої команди BEGIN TRANSACTION.
Зміни всередині вкладених транзакцій запишуться на диск. поки не завершиться самий верхній рівень. тобто не буде виконана остання команда END TRANSACTION.
Якщо транзакції виконуються над одними і тими ж даними. то перевага має ту зміну. яке було виконано останнім. незалежно від того. на якому рівні воно знаходиться. Наприклад.
REPLACE count WITH 103 FOR count = 203
REPLACE count WITH 203 FOR count 103
У таблиці значення поля так і залишиться рівним 203.
Перепишемо даний приклад так. що остання команда REPLACE буде виконуватися перед наступним рівнем вкладеності.
REPLACE count WITH 203 FOR count 103
REPLACE count WITH 103 FOR count = 203
Тепер значення поля залишиться тим же. що і було - 103.
Кілька порад щодо збільшення продуктивності при роботі в мережі в додатках Microsoft Visual FoxPro
Якщо локальна станція має достатньо місця на жорсткому диску або досить RAM, то ви можете поліпшити продуктивність. розмістивши тимчасові файли на локальному диску або на RAM диску. Перенаправлення цих файлів на локальний диск або диск RAM збільшує продуктивність за рахунок зменшення звернення до мережного диска. Ви можете вказати альтернативне місцезнаходження для цих файлів. включивши вираження EDITWORK, SORTWORK, PROGWORK і TMPFILES в ваш файл CONFIG.FPW.
Якщо є можливість відсортувати дані. то має сенс це зробити. так як робота з таблицями відбувається швидше. якщо у вас не включені індекси. Тобто використовуйте пошук за допомогою команди. а потім відключайте порядок індексу.
Якщо є можливість працювати з якими - то файлами монопольно. то використовуйте цю можливість. так як при монопольному режимі доступ до таблиць здійснюється швидше. Щоб зменшити ймовірність одночасний доступ до запису або таблиці.
скорочуйте час блокувань. що можна здійснити. блокуючи записи тільки при збереженні даних на диск. а не під час їх редагування. Оптимістична буферизация забезпечує вам найкоротший час блокування.
Засоби налаштування оболонки Access дозволяють встановити режими за замовчуванням для відкриття баз даних і таблиць. Для цього використовується команда Параметри в меню Сервіс. після
converted to PDF by HupBaH9I
того як з'явиться діалогове вікно. показане на рис. 7.20, необхідно перейти на вкладку Інші. Після цього. використовуючи набір кнопок "Блокування за замовчуванням", ви можете вибрати необхідний тип блокування.
При виборі кнопки "Відсутня" ви зможете встановити тільки нежорстку блокування записи. За допомогою такого блокування все редаговані записи доступні для інших користувачів. але при цьому. коли виотредактіруете запис і спробуєте зберегти зміни. то зіткнетеся з одним з двох варіантів. Перший. найпростіший. крім вас запис ніхто не редагував і зроблені зміни заносяться на диск. Другий. після того як ви почали редагувати дані. хто - то встиг змінити їх раніше вас і записати зміни на диск. В останньому випадку з'явиться вікно повідомлення. в якому буде запропоновано три варіанти виходу з ситуації, що склалася. ігнорувати чужі зміни і записати на диск свої. скопіювати змінену запис в буфер обміну. зберегти чужі зміни і скасувати свої. Цей режим іноді називається "оптимістичній" блокуванням.
Якщо ви виберете блокування змінною записи. то для інших користувачів буде заблокована запис. яку ви редагуєте. і сусідні з нею записи. так як Access встановлює блокування для сторінки. Сторінка для таблиць Access є набір записів розміром в 2 кілобайт. Цю блокування іноді називають "песимістичної".
При виборі блокування всіх записів інші користувачі не зможуть відкрити таблицю. При цьому слід звернути увагу на той факт. що якщо ви працюєте з даними за допомогою
форми. то можете встановити для неї блокування за допомогою властивості RecordLocks, які можуть відрізнятися від установок за замовчуванням для поточного сеансу роботи Access. Ці типи блокувань строго відповідають тим видам. які ви встановлюєте за допомогою діалогового вікна Параметри.
Властивість RecordLocks крім форм присутня ще у запитів і звітів. При цьому для звітів немає можливості встановити блокування змінною записи. швидше за все тому. що звіт їх змінювати не може.
У діалоговому вікні Параметри можна встановити режим за замовчуванням для відкриття баз даних. Але врахуйте. що режим доступу до баз даних можна вибирати при їх відкритті за допомогою діалогу відкриття. Якщо бази даних відкриваються монопольно. то інші користувачі не зможуть відкрити їх. тому даний режим навряд чи підходить для мережевого використання.
converted to PDF by HupBaH9I
Крім візуальних засобів установки різних режимів блокування. ви можете використовувати об'єкт Application для їх зміни.
У наступному прикладі за допомогою методу SetOption об'єкта Application встановлюється песимістична блокування (блокування сторінки), а за допомогою методу GetOption і функції MSGBOX () виводиться номер поточної блокування.
Public Sub mygetoption () Dim mystr As String
Application.SetOption "Блокування за замовчуванням", 2
mystr = Application.GetOption ( "Блокування по _ замовчуванням") MsgBox (mystr)
Для форм. звітів і запитів ви звертаєтеся до властивості RecordLocks, але врахуйте. що для вже
відкритих примірників об'єктів на різних призначених для користувача машинах властивість не зміниться. Тобто. змінивши властивість якогось об'єкта. вам попутно треба переконати користувача закрити і знову відкрити об'єкт. для того щоб він зміг скористатися всіма перевагами нового значення. Приклад зміни властивості Recordlocks для запиту.
Public Sub myqueryproperties ()
Dim db As DATABASE, qd As QueryDef
Set db = DBEngine.Workspaces (0) .Databases (0) db.QueryDefs ( "Моя таблиця query"). Properties ( "recordLocks") = 2 End Sub
Приклад зміни властивості RecordLocks для форми. Public Sub ActiveFormRecordLocksChange
Screen.ActiveForm.RecordLocks = 2 End Sub
Врахуйте. що. як правило. під час роботи форми змінювати це властивість немає сенсу. оскільки не дивлячись на те. що ви його встановіть. форма буде використовувати блокування колишнього типу.
1. Створіть функцію. яка буде містити одну сходинку. ActiveFormRecordLoc1ksChange, тобто виклик процедури. яка у вас може називатися по - іншому.
2. Створіть макрос. виконує одну дію RunCode, аргументом якого буде виклик нашій функції. яка. наприклад. може називатися fActiveFormLocksChange.
3. Створіть для користувача панель інструментів. в яку необхідно перетягнути графічне зображення макросу з вкладки Макроси.
Виконавши цю послідовність дій. ви отримаєте призначену для користувача панель інструментів з однією кнопкою. яка в режимі Конструктора буде встановлювати для вашої форми властивість RecordLocks рівним значенню 2, що відповідає блокування змінною записи. Проявивши фантазію. ви можете доповнити вашу панель інструментів більш витонченими інструментами. але основа технології їх створення описана вище.
Очевидно. що те ж саме ви можете зробити і для звітів.
Для того щоб ви були впевнені. що всі операції. які ви хочете провести. були виконані. використовуйте методи BeginTrans, CommitTrans і RollBack об'єкта Workspace.
Метод BeginTrans починає транзакцію. Під транзакцією мається на увазі серія змін. які проводяться над даними і структурою бази даних. Якщо з якої - небудь причини операції. що входять в поточну транзакцію. не можуть бути завершені. то система повертається в початковий стан. При цьому пам'ятайте. що на робочій станції повинно бути достатньо місця на диску. так як при виконанні транзакції вся інформація про операції в неї входять заноситься на диск.
Транзакції повинні завершуватися за допомогою звернення до методу CommitTrans. Транзакції можуть бути вкладеними. не забувайте. що для того. щоб завершити транзакцію більш високого рівня. спочатку необхідно завершити вкладені транзакції. Якщо з яких - небудь причин програма не зможе звернутися до методу CommitTrans, то система повернеться в первинний стан.
Кількість вкладених транзакцій в Access, так само як і в Visual FoxPro, не може перевищувати п'яти. При цьому зверніть увагу на наступний факт. Метод CommitTrans для поточного об'єкта Workspaces робить все зміни незворотними. В той же час. якщо транзакція вкладена. то
converted to PDF by HupBaH9I
відкат транзакції на більш високому рівні призведе систему в первинний стан.
У наведеному нижче прикладі застосовується транзакція для переходу на другий запис і зміни значення для поля Прізвище. Перед завершенням транзакції верхнього рівня пропонується прийняти рішення. заносити зміни на диск чи ні.
Dim db As DATABASE, wks As Workspace, rst As _ Recordset Dim otvet As Integer
Set wks = DBEngine.Workspaces (0) Set db = wks.Databases (0)
Set rst = db.OpenRecordset ( "Моя таблиця", _ dbOpenDynaset) wks.BeginTrans
rst.MoveLast rst.AbsolutePosition = 2 rst.Edit
rst. ПРІЗВИЩЕ = "Макашарипов" rst.UPDATE
otvet = MsgBox ( "Змінити", vbYesNo + _ vbDefaultButton1, "Ваше рішення") If otvet = vbYes Then
wks.Rollback End If
Крім вкладених транзакцій в Access можна використовувати паралельні транзакції. Ці транзакції діють незалежно один від одного. Але при цьому вам необхідно створити ще один об'єкт типу Workspace. Відповідно кожна транзакція завершується незалежно один від одного.
Наступний приклад буде працювати. тільки якщо встановлений режим блокування "Відсутня". В даному прикладі зверніть увагу на два останні рядки коду. Навіть якщо ви поміняєте ці рядки місцями. нічого не зміниться. тобто друга транзакція не працює з даними. реально зберігаються на диску.
Public Sub multipletrans ()
Dim db As DATABASE, wks As Workspace, rst As _ Recordset Dim db1 As DATABASE, wks1 As Workspace, rst1 As _ Recordset Set wks = DBEngine.Workspaces (0)
Set db = wks.Databases (0)
Set rst = db.OpenRecordset ( "Моя таблиця", _ dbOpenDynaset) Set wks1 = DBEngine.Workspaces (0)
Set db1 = wks1.Databases (0)
Set rst1 = db1.OpenRecordset ( "Моя таблиця", _ dbOpenDynaset) wks.BeginTrans
rst.FindFirst "[Прізвище] = 'Клінтон'" rst.Edit
rst. ПРІЗВИЩЕ = "Доул" rst.UPDATE wks1.BeginTrans
rst1.FindFirst "[Прізвище] = 'Доул'" rst1.Edit
rst1. ПРІЗВИЩЕ = "Клінтон" rst1.UPDATE wks.CommitTrans wks1.CommitTrans
Транзакції є глобальними в рамках об'єкта Workspace. Тому ваші транзакції можуть охоплювати кілька баз даних і. відповідно. все безліч об'єктів. які в них містяться.
Об'єкти типу Database і Recordset мають властивість Transactions, яке може набувати значень True або False. Від їх значень залежить. чи зможете ви використовувати методи BeginTrans, CommitTrans і Rollback для роботи з цими об'єктами. Іноді має сенс перевіряти