Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
управление данными.doc
Скачиваний:
46
Добавлен:
11.03.2015
Размер:
1.51 Mб
Скачать

Пессимистическая блокировка

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

Как правило, бывает нежелательным, чтобы пользователи одновременно редактировали одну и ту же запись. Поэтому, если используется блокировка на уровне записей, рекомендуется применять пессимистическую блокировку. Однако в некоторых ситуациях предпочтение следует отдавать оптимистической блокировке. Например, если некоторые пользователи подолгу блокируют записи или если используется блокировка на уровне страниц.

Режим блокировки можно настраивать отдельно для каждого объекта базы данных, манипулирующего наборами записей.

Блокировка и формы

Главным недостатком оптимистической блокировки является возможность конфликтов записи. Когда такой конфликт происходит в связанной форме, Access выводит на экран диалоговое окно Конфликт записи. В этом окне представлены три опции.

  1. Сохранить запись. Если пользователь выберет эту опцию, вносимые им изменения заменяют изменения, сделанные другим пользователем. Данную опцию применяют редко.

  2. Копировать в буфер. Эта опция копирует производимые пользователем изменения в буфер обмена и обновляет текущую запись, чтобы в ней отразились изменения, сделанные другим пользователем.

  3. Отменить изменения. При выборе этой опции все произведенные пользователем изменения будут отменены, а запись отразит изменения, сделанные другим пользователем.

В формах с пессимистической блокировкой конфликтов записи не бывает, поскольку два пользователя не могут одновременно редактировать одну и ту же запись. Пиктограмма с перечеркнутым кружком, которая заменяет селектор записи, сообщает другим пользователям, что запись заблокирована и редактировать ее пока нельзя.

Транзакции

Группа операций над данными, которая должна рассматривается СУБД как одна операция, называется транзакцией. Либо все операции входящие в транзакцию выполняются успешно, либо транзакция полностью отменяется.

Рассмотрим пример. Пусть отношение Товары включает атрибут Общий объем, представляющий собой общий объем поставок для каждого товара. Значение Общий объем для любого определенного товара предполагается равным сумме всех значений атрибута объем отношения Поставки для всех поставок данного товара. В случае поставки необходимо выполнить две операции: добавить запись в таблицу Поставки и обновить поле Общий объем в таблице Товары.

Под транзакцией можно понимать преобразование одного согласованного состояния базы данных в другое, причем в промежуточных точках база данных находится в несогласованном состоянии. Не допустимо, чтобы одна из операций была выполнена, а другая нет, так как база данных остается в несогласованном состоянии (поставка зафиксирована, а общий объем не увеличился). В идеальном случае должны быть выполнены обе операции. Однако между двумя операциями может возникнуть ошибка, например поле Общий объем окажется заблокированным другим пользователем. Если использовать транзакцию, то система гарантирует, что все операции будут отменены.

Для организации транзакций можно использовать средства VBA, а именно библиотеку объектов доступа к данным ADO.

В ADO обработку транзакций обеспечивают три метода объекта Connection:

  • BeginTrans - отмечает начало последовательности операций, которые должны быть объединены в одну транзакцию;

  • CommitTrans – записывает результаты всех этих операций на диск;

  • RollbackTrans – выполняет откат транзакции, т.е. отмену всех изменений, выполненных после последнего вызова BeginTrans.

Примерная базовая схема ADO-кода с обработкой транзакций приведена ниже:

Function Fun1

OnError GoTo FunErr

Dim cnn As ADODB.Connection

Dim cmd As ADODB.Command

Dim fInTrnas As Boolean

Set cnn = CurrentProject.Connection

Set cmd = New ADODB.Command

cmd.ActiveConnection = cnn

cmd.CommandText = Запрос1

cnn.BeginTrans

fInTrans = True

cmd.Execute 'последовательность изменений данных.

cmd.CommandText = Запрос2

cmd.Execute

cnn.CommitTrans

fInTrans = False

FunExit:

Set cmd = Nothing

cnn.Close

Set cnn = Nothing

Exit Function

FunErr : ‘ при выполнении функции возникла ошибка

If fInTrans Then ‘ если ошибка возникла внутри транзакции

Cnn.RollbackTrans ‘ производим откат транзакции

End If

Resume FunExit

End Function

Если в ходе выполнения транзакции ядро базы данных обнаруживает, что нужная запись блокирована, происходит стандартная перехватываемая ошибка. В этом случае нужно либо дождаться освобождения записи, либо отменить транзакцию.

Применение транзакции, гарантирует целостность вносимых пользователем изменений данных, однако в ущерб производительности одновременной работы нескольких пользователей. Это связано с тем, что внутри транзакции ядро базы данных накапливает блокировки записей до тех пор, пока вся транзакция не будет сохранена. Поэтому, если внутри транзакции обрабатывается большой объем данных, каждым из пользователей подолгу будет блокироваться большое количество записей.

Выполняя запрос, не возвращающий данных, Access может обрабатывать его как одну транзакцию. Этим процессом можно управлять как с помощью объектов ADO, так и средствами пользовательского интерфейса.

В окне свойств сохраненного запроса на выполнение свойству UseTransaction можно присвоить значение No, чтобы Access не заключала запрос в транзакцию. Это повысит скорость обновления большого количества записей, но в случае ошибки отменить изменения будет невозможно. По умолчанию данное свойство имеет значение Yes, т.е. Access заключает любой запрос на выполнение в транзакцию.