多用户数据库中的自动号码访问与唯一性维护



关于Access的一般性问题,但希望有一个相当简单的答案:

当你在一个共享的多用户数据库中使用autonumber时,Access是否做了任何特别的事情来确保它分配的号码是唯一的,与其他用户同时添加记录呢?

它是立即为连接到该表的第一个用户声明下一个号码,还是等到新记录即将保存时,在分配下一个号码之前检查表中所有保存记录的最高编号?

它的唯一性在多用户环境中健壮吗?

为了完整地回答你的问题,重要的是要区分

  • "访问"(应用程序)和

  • "Access Database Engine"(又名Access Database Engine)。"ACE")及其前身Jet数据库引擎

当你在一个共享的多用户数据库中使用autonumber时,Access是否做了任何特别的事情来确保它分配的号码是唯一的,与其他用户同时添加记录呢?

[…]

它的唯一性在多用户环境中健壮吗?

是的。与许多其他数据库引擎一样,ACE通常在将记录提交(写入)到表时分配该编号,从而确保Identity列(Access称之为"自动编号字段")在多用户环境中是唯一的。但是,ACE确实为Access提供了提前获取其自动编号值的机会(见下文)。

[Access]是否立即为第一个连接到该表的用户声明下一个数字,

。简单地"连接到"表(例如,通过执行SELECT或打开Recordset)不会影响自动编号字段的计数器。

还是[Access]等到新记录即将被保存,并在分配下一个数字之前检查表中所有保存记录的最高数量?

取决于…

如果"表"是一个链接到ODBC数据源的表(例如,一个带有IDENTITY列的SQL Server表),那么是的,Access"等待",直到用户做一些将提交(保存)新记录的事情,此时它将新记录提交给数据库服务器,然后检索该记录的auto - number值(例如,通过SQL Server中的SELECT @@IDENTITY,或其他数据库引擎的类似机制)。

但是,如果"表"是本机ACE/Jet表,那么您可能会注意到,在开始键入新记录(例如,在数据表视图中,或在绑定表单中)后,新的自动编号值立即出现。在本例中,Access(应用程序)告诉ACE(数据库引擎),它可能想要插入一条新记录,并立即请求AutoNumber值。ACE返回该值并增加计数器,以便发出相同请求的另一个用户将获得序列中的下一个数字。请注意,这个过程"消耗"AutoNumber值:它要么被使用(如果用户保存了记录),要么被丢弃(如果用户决定不保存记录),但它不会被重用。这就是为什么

  • ACE自动编号字段是"递增"(而不是"随机")有时有"空白"在他们,和

  • 如果你开始输入数据,按Esc取消插入,然后重新开始输入,自动编号值是不同的(因为你"消耗"了以前的自动编号值,即使你没有保存记录)。

答案是:是的。MS Access数据库,像任何其他通用RDB一样,非常适合在多用户环境中运行(尽管性能方面可能没有那么快,例如SQL Server,并且它的数据安全模型不是那么复杂)。此外,主键(即自动编号)的唯一性是在表级别上提供的;换句话说,它不是GUID(全局唯一ID)。

最新更新