关于 Access 的一些一般性问题,但希望有一个相当简单的答案:
当您在共享的多用户数据库中使用自动编号时,Access 是否会做任何特别的事情来确保它分配的编号是唯一的,而其他用户同时添加记录呢?
它是立即为第一个连接到该表的用户声明下一个编号,还是等到新记录即将保存并在分配下一个编号之前检查表中所有已保存记录的最大编号?
它的独特性在多用户环境中是否稳健?
关于 Access 的一些一般性问题,但希望有一个相当简单的答案:
当您在共享的多用户数据库中使用自动编号时,Access 是否会做任何特别的事情来确保它分配的编号是唯一的,而其他用户同时添加记录呢?
它是立即为第一个连接到该表的用户声明下一个编号,还是等到新记录即将保存并在分配下一个编号之前检查表中所有已保存记录的最大编号?
它的独特性在多用户环境中是否稳健?
为了完全回答您的问题,重要的是要区分
“访问”(应用程序),以及
“Access 数据库引擎”(又名“ACE”)及其前身 Jet 数据库引擎。
当您在共享的多用户数据库中使用自动编号时,Access 是否会做任何特别的事情来确保它分配的编号是唯一的,而其他用户同时添加记录呢?
[...]
它的独特性在多用户环境中是否稳健?
是的。ACE 与许多其他数据库引擎一样,通过通常在记录提交(写入)到表时分配该编号来确保标识列(Access 称之为“自动编号字段”)在多用户环境中是唯一的。但是,ACE 确实为 Access 提供了提前获取其 AutoNumber 值的机会(见下文)。
[Access] 是否立即为第一个连接到该表的用户声明下一个号码,
不会。简单地“连接到”表(例如,通过执行 SELECT 或打开 Recordset)不会影响 AutoNumber 字段的计数器。
还是 [Access] 等到新记录即将被保存并在分配下一个编号之前检查表中所有已保存记录的最大编号?
那要看...
如果“表”是到 ODBC 数据源的链接表(例如,具有 IDENTITY 列的 SQL Server 表),那么是的,Access“等待”直到用户执行将提交(保存)新记录的操作,此时点它将新记录提交给数据库服务器,然后检索该记录的自动编号值(例如,通过SELECT @@IDENTITY
在 SQL Server 中,或其他数据库引擎的类似机制)。
但是,如果“表”是本机 ACE/Jet 表,那么您可能会注意到新的自动编号值在您开始输入新记录后立即出现(例如,在数据表视图中,或在绑定表单中)。在这种情况下,Access(应用程序)告诉 ACE(数据库引擎)它可能想要插入一条新记录并立即请求 AutoNumber 值。ACE 返回该值并递增计数器,因此发出相同请求的另一个用户将获得序列中的下一个数字。请注意,此过程“消耗” AutoNumber 值:它将被使用(如果用户保存记录)或丢弃(如果用户决定不保存记录)但不会被重新使用。这就是为什么
“递增”(相对于“随机”)的 ACE 自动编号字段有时会出现“间隙”,并且
如果你开始输入数据,点击Esc取消插入,然后再次开始输入,自动编号值是不同的(因为即使你没有保存记录,你也“消耗”了以前的自动编号值)。
答案是:是的,是的。MS Access 数据库与任何其他通用 RDB 一样,非常适合在多用户环境中运行(尽管在性能方面它可能没有 SQL Server 那样快,而且它的数据安全模型也没有那么复杂)。此外,主键的唯一性(即自动编号)在表级别提供;换句话说,它不是 GUID(全局唯一 ID)。