Транзакции являются методами объекта
ADOConnection.
Метод | Описание |
BeginTrans | С вызова данного метода начинается выполнение транзакции. |
CommitTrans | Завершает последовательность процессов и в случае отсутствия ошибок сохраняет внесенные изменения в базе данных., |
RollbackTrans | В случае появления ошибки отменяет процесс и возвращает базу данных в состояние, в котором она была до выполнения команды BeginTrans. |
В листинге 1 приводится пример использования транзакции.
Листинг 1 Использование транзакции в VBA:
Function TestTrans() As Boolean
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
On error resume Err_TestTrans
Set conn = New ADODB.Connection
Conn.BeginTrans
'выполнениепроцессов, подобныхоператорам SQL, либометодов .Edit,
'.Update, .AddNew Methods
' В случае отсутствия ошибок изменения сохраняются.
Conn.CoimnitTrans
Exit Function
Err_TestTrans:
'В случае возникновения ошибок выполняется откат транзакции.
Conn.RollbackTrans
………………………..
EndFunction
Транзакции могут быть вложенными, когда сохранение результата одной транзакции зависит от корректности выполнения другой. В случаях вложения транзакций необходимо проверять корректность их выполнения, начиная с низшего (внутреннего) и заканчивая наивысшим (внешним) уровнем.
Блокировка Oracle/SQL Server
При работе с Oracle, SQL Server, Informix или любым другим серверным механизмом баз данных Access более не осуществляет управление блокировкой. Однако основная концепция остается неизменной - Access управляет доступом к записям в базе данных, обеспечивая многим пользователям одновременный доступ к ней.
Серверы данных прекрасно справляются с этой задачей. Поскольку данные размещаются вместе с механизмом баз данных, блокировка записи и управление одновременным использованием может осуществляться быстро, четко и надежно. Каждое из этих приложений хранит информацию о блокировке в таблице, постоянно находящейся в памяти, и может применять наиболее эффективный тип блокировки, выполнять операцию и снимать блокировку за считанные секунды.
При использовании Microsoft SQL Server могут применяться следующие типы блокировок:
• Shared Lock (Общая блокировка). Подобная блокировка используется в операциях обработки данных, доступных только для чтения. Общие блокировки позволяют другим пользователям читать запись или страницу, являющуюся объектом общей блокировки. На запись или страницу может одновременно налагаться несколько общих блокировок. Такие блокировки снимаются по окончании использования данных.
• Exclusive Lock (Монопольная блокировка). Такая блокировка используется при выполнении по отношению к данным операторов SQL UPDATE, DELETE или INSERT. При этом на монопольно блокированные данные не могут налагаться никакие другие блокировки до тех пор, пока SQL Server не снимет монопольную блокировку.
• Live Lock (Временная блокировка). Подобная блокировка является запросом на монопольную блокировку, возникающим после четырех последовательных неудачных попыток применения монопольной блокировки данных. Такая блокировка возникает в случаях наличия слишком большого количества перекрывающихся общих блокировок. В подобной ситуации SQL Server перестает применять общие блокировки. Временные блокировки предотвращают монополизацию таблицы или страницы общими блокировками (при операциях считывания) и запрещают операции, связанные с записью (UPDATE, DELETE, INSERT). Они также предотвращают ситуацию, называемую "насыщением блокировки".
Существуют и другие используемые SQL Server стратегии обработки проблем одновременного доступа. К ним относятся динамическая блокировка на уровне строки (SQL Server 7.0), предотвращение, выявление и исправление взаимной блокировки, управление оптимистической блокировкой, а также наращивание масштабируемых блокировок.
Динамическая блокировка данных на уровне строки соответствующим диспетчером SQL Server динамически настраивает конфигурацию сервера блокировок, исходя из размера и характеристик использования базы данных. Это в значительной степени уменьшает необходимость в ручной настройке и поддержке сервера блокировки.
При предотвращении, выявлении и исправлении взаимной блокировки SQL Server выявляет момент возникновения конфликта двух транзакций. В подобной ситуации выясняется, что одна транзакция монопольно блокировала данные, требуемые другой транзакцией, а та, в свою очередь, монопольно блокировала данные, требуемые первой. Обе транзакции не могут снять свои блокировки. Без вмешательства механизма баз данных они остаются в состоянии взаимной блокировки, для снятия которой SQL Server осуществляет откат одной транзакции, завершает другую и снова запускает первую.
SQL Server активно предотвращает взаимные блокировки, значительно уменьшая количество блокировок в таблицах.
Для обеспечения работы многих пользователей SQL Server использует подход оптимистического управления одновременным доступом. При оптимистическом подходе для просмотра данных пользователи могут применять курсор со стороны сервера, не вызывая их блокировки. Вместо этого SQL Server выявляет изменения возвращаемых строк и затем действует соответствующим образом (обычно отклоняя изменение, если только оно не сопровождается явной инструкцией блокировки). Такой подход увеличивает объем доступных данных без интенсивного управления блокировкой и вызываемой этим перегрузки.
Резюме
В данной главе исследовались вопросы работы в многопользовательской среде, начиная с конфигурирования файла базы данных и заканчивая выбором наборов записей и работой со страницами и записями данных. Подробно рассматривались различные стратегии блокировки, сравнивались методы оптимистической и пессимистической блокировки, описывались преимущества новых возможностей механизма баз данных Jet при блокировке на уровне строки. Приводились аргументы выбора применяемых приложением типов блокировки, а также давались советы по использованию сообщений об ошибках, поступающих от поставщика OLEDB. В целом эта глава призвана помочь в выработке эффективной стратегии и тактики при создании нового приложения, она может также оказаться полезной и при отладке существующей базы данных.
Приведенная информация носит обзорный характер. Основную же ценность представляет опыт практической разработки приложений для работы в многопользовательской среде. При этом следует уделять особое внимание разрешению конфликтов доступа, которые неминуемо возникают в реальной ситуации. Однако в Access имеются специальные средства для решения подобных проблем.