Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

在 DAO 记录集中使用事务

时 间:2022-01-29 09:03:12
作 者:杨雪   ID:42182  城市:南京
摘 要:事务是捆绑在一起并作为单个工作单元处理的一组操作。 事务中的工作必须当做整体完成;如果事务的任何部分失败,则整个事务都将会失败。
正 文:

事务这一概念使开发人员能够强制实施数据完整性。 由于绑定成一个单元的多个数据库操作要么全部成功,要么全部失败,因此数据库不会出现不一致的状态。 大多数数据库管理系统都使用事务。

最常见的事务处理示例包括银行的自动取款机 (ATM)。 分发现金然后将用户帐户记入借方的过程被视为一个逻辑工作单元并封装在一个事务中:除非系统也能够将帐户记入借方,否则不会分发现金。 通过使用事务,整个操作要么成功要么失败。 这样可以保持 ATM 数据库的一致状态。

如果希望确保一组操作中的每个操作在提交所有操作之前都成功,应考虑使用事务。 请记住,所有事务对其他事务都是不可见的。 也就是说,在提交事务之前,任何事务都看不到其他事务对数据库的更新。

备   注
Access 数据库的事务行为与 ODBC 数据源的行为不同,如SQL Server。 例如,如果数据库连接到文件服务器,而该文件服务器在事务提交其更改之前停止,则数据库会处于不一致的状态。 如果需要与持续性相关的真正事务支持,您应该使用客户端/服务器体系结构进行调查。

Access 数据库引擎通过 Workspace 对象的 DAO BeginTrans、CommitTrans 和 Rollback 方法支持事务。

下面的代码示例更改 Employees 表中所有销售代表的职务。 首先用 BeginTrans 方法启动一个事务,隔离对 Employees 表所做的全部更改,然后用 CommitTrans 方法保存更改。 请注意,可以使用 Rollback 方法撤消用 Update 方法保存的更改。

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

使用事务时,指定的 Workspace 对象中所有数据库和 Recordset 对象都受到影响;事务是工作区的全局事务,而不是特定数据库或 Recordset 的全局事务。 如果对多个数据库执行操作或者在一个工作区事务内执行操作,则 Commit 和 Rollback 方法会影响事务过程中该工作区内更改的所有对象。

还可以将 BeginTrans、CommitTrans 和 Rollback 方法与 DBEngine 对象一 同使用。 在这种情况下,事务将应用于默认工作区,即 DBEngine.Workspaces(0) 。


Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助