2013-05-09 70 views
2

有关访问略显一般的问题,但希望有一个相当简单的答案:访问自动编号和维护唯一性在多用户数据库

当您在一个共享的多用户数据库使用自动编号,是访问做什么特别的事来确保它分配的号码与其他用户同时添加记录的号码是唯一的?

它是否立即声明连接到该表的第一个用户的下一个号码,还是等到新的记录将要保存并且在分配之前检查表中所有保存的记录的最大数量下一个号码?

其在多用户环境中的独特性是否稳健?

+0

顺便说一句,这是一个很好的问题(^) – 2013-05-10 00:16:07

+0

它基本上开始一个交易。如果您使用自动编号PK打开绑定到表格的表单,则会锁定该数字。自动编号将绝对保证您的独特性,但不会下单。如果用户A启动一个事务并且用户B在同一个表上启动一个事务,则用户A将在数字1上锁定,而用户B在2上锁定。如果用户A没有提交数据,用户B将插入ID为2的表中的第一条记录。 – Scotch 2013-05-10 01:22:17

回答

4

为了充分回答你的问题之间做出

  • “访问”(应用程序),并

  • “访问数据库引擎”(又名“ACE的区别是很重要的“)及其前身Jet数据库引擎。

当您在一个共享的多用户数据库使用自动编号,是获得做什么特别的事,以确保它分配的数量与其他用户在同一时间加入独特记录什么?

[...]

是在多用户环境中其独特强大的?

是。与许多其他数据库引擎一样,ACE通过在将记录提交(写入)表时正常分配该数字来确保Identity列(哪些Access称为“AutoNumber字段”)在多用户环境中是唯一的。但是,ACE确实提供了Access提前获取其AutoNumber值的机会(请参见下文)。

不[访问]立即权利要求的下一个数字对谁已连接到该表中的第一个用户,

号只需“连接到”一个表(例如,通过执行一个SELECT,或打开Recordset)不会影响AutoNumber字段的计数器。

或者确实[Access]等到新记录即将被保存并且在分配下一个数字之前检查表中所有保存记录的最大数量?

这取决于...

如果“表”是链接表到ODBC数据源(例如与标识列的SQL Server表)然后是,进入“等待”,直到用户做一些事情,将提交(保存)的新纪录,此时它提交新记录到数据库服务器,然后检索自动编号值(例如,通过SQL Server中的SELECT @@IDENTITY或其他数据库引擎的类似机制)。但是,如果“table”是本机ACE/Jet表,那么您可能会注意到,在开始键入新记录(例如,在数据表视图中或绑定形式)后,新的AutoNumber值立即出现, 。在这种情况下访问(应用程序)告诉ACE(数据库引擎),它可以要插入一个新的记录,并请求自动编号值的时候了。 ACE返回值并递增计数器,使得发出相同请求的另一个用户将获得序列中的下一个数字。请注意,此过程会“消耗”AutoNumber值:它将被用于(如果用户保存记录)或被丢弃(如果用户决定不保存记录),但不会被重新使用。这就是为什么

  • ACE自动编号字段是“增量”(而不是“随机”),有时对他们有“缺口”,并

  • ,如果你开始输入数据,命中Esc键到取消插入,然后再次开始输入,AutoNumber值是不同的(因为即使没有保存记录,您也“消耗”了以前的AutoNumber值。

+0

很好的解释 - 特别是关于ACE在开始新记录时“消耗”数字。谢谢。 – 2013-05-10 09:07:33

+0

一个很好的回应 - 我没有更多要补充的地方! +1 – 2013-05-11 19:38:56

+0

我使用的Informix RDB服务器在客户端提交给服务器时指定下一个可用的SERIAL(自动编号)值。我倾向于更喜欢这种方法,因为它不会在序列中产生任何缺陷,如果客户端中止提交。 – 2013-09-29 08:48:17

2

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

+0

如果Ms Access完全适合在多用户环境中运行,为什么ppl更喜欢SQL来实现多用户环境? – Santosh 2013-05-10 00:05:33

+0

取决于你有多少用户,您的性能需求,你的资源,等等 – 2013-05-10 00:09:08

+0

其他RDB可以提供更好的性能和数据安全性,我把我的答案。 – 2013-05-10 00:11:31