Поделиться через


Использование транзакций в наборе записей DAO

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

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

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

Примечание.

Поведение транзакций с базами данных Access отличается от поведения источников данных ODBC, таких как SQL Server. Например, если база данных подключена к файловму серверу и файловый сервер останавливается до того, как транзакция успеет зафиксировать изменения, то база данных может остаться в несогласованном состоянии. Если требуется реальная поддержка транзакций в отношении устойчивости, следует изучить архитектуру клиента или сервера.

Ядро СУБД Access поддерживает транзакции с помощью методов DAO BeginTrans, CommitTrans и Rollback объекта Workspace .

В следующем примере кода изменяется должность всех торговых представителей в таблице Employees. После того как метод BeginTrans запускает транзакцию, которая изолирует все изменения, внесенные в таблицу Employees, метод CommitTrans сохраняет изменения. Имейте в виду, что для отмены изменений, сохраненных с помощью метода Update, можно использовать метод Rollback.

Sub ChangeTitle() 
 
Dim wrkCurrent As DAO.Workspace 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployee As DAO.Recordset 
 
On Error GoTo ErrorHandler 
 
   Set wrkCurrent = DBEngine.Workspaces(0) 
   Set dbsNorthwind = CurrentDB 
   Set rstEmployee = dbsNorthwind.OpenRecordset("Employees") 
 
   wrkCurrent.BeginTrans 
   Do Until rstEmployee.EOF 
      If rstEmployee!Title = "Sales Representative" Then 
         rstEmployee.Edit 
         rstEmployee!Title = "Sales Associate" 
         rstEmployee.Update 
      End If 
      rstEmployee.MoveNext 
   Loop 
 
   If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then 
      wrkCurrent.CommitTrans 
   Else 
      wrkCurrent.Rollback 
   End If 
 
   rstEmployee.Close 
   dbsNorthwind.Close 
   wrkCurrent.Close 
 
   Set rstEmployee = nothing 
   Set dbsNorthwind = Nothing 
   Set wrkCurrent = Nothing 
 
   Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

При использовании транзакций затрагиваются все базы данных и объекты Recordset в указанном объекте Workspace ; транзакции являются глобальными для рабочей области, а не для определенной базы данных или набора записей. При выполнении операций с несколькими базами данных или в рамках транзакции рабочей области методы Commit и Rollback влияют на все объекты, измененные в этой рабочей области во время транзакции.

Вы также можете использовать методы BeginTrans, CommitTrans и Rollback с объектом DBEngine . В этом случае транзакция применяется к рабочей области по умолчанию, которая имеет значение DBEngine.Workspaces(0).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.