MS Access(MDB)并发

时间:2009-03-29 16:40:13

标签: .net database ms-access concurrency ms-jet-ace

对于一个小项目,我需要使用一个要求很低的简单数据库:几个表,总共不超过几千条记录,2或3个用户。我在.NET环境中工作。

作为一个数据库服务器(即使是那些Express版本)在这种情况下似乎是一个巨大的过度杀伤,一个非常简单的MDB数据库可以满足大多数要求。但是,我关注并发性。我的想法是将.mdb文件放在网络共享上,让用户从基于.NET的客户端访问该文件。数据库主要针对只读操作,但用户有时也需要更新/删除记录。如果当时不可能(由于数据库被锁定或其他),我可以在客户端上保存更新并在以后处理它们。

问题本身就是这些问题:

  • 如何在MDB中处理并发读取?
  • 如何在MDB中处理并发更新/删除?
  • 是否存在锁定概念以及如何在.NET应用程序中利用它?
  • 将MDB文件放在网络共享上是好还是可怕?

当我在.NET工作时,我也想知道如何检测任何并发问题并采取适当的措施。即,我应该抓住哪个例外以及你建议采取什么行动?

编辑:这可能是我对问题的错误描述,但大多数答案似乎都建议选择一个完整的数据库服务器。我确实理解了安装服务器的差异和好处,并且实际上在MSSQL和Oracle上实现了相当多的项目。但是,在这个问题中,我只关心Access及其并发问题,所以请不要建议使用db服务器。

感谢您的帮助。

11 个答案:

答案 0 :(得分:49)

答案 1 :(得分:12)

多年来,我在Access中构建了十几个小型商业应用程序。大多数用户一次最多只有10-20个用户。数据库在“app”和“data”数据库之间分开。性能良好,并没有出现问题。自Access 2000 SP2以来,腐败基本上也不存在。

有很多人说“不要使用Access” - 好吧,如果做得对(即专业开发人员)访问是一个非常好的开发包,我已经很好地利用它。我的客户对我的建设非常满意。

答案 2 :(得分:11)

我写过两个商业产品,它们使用从网络共享运行的Access数据库,通常最多10个用户。如果你不滥用它,那真的没问题;但正如你所看到的那样,许多开发人员都没有到达那里 - 而且由于它的低端特性,它上面还有许多糟糕的黑客攻击。在一个产品的情况下,我不得不重新设计应用程序,因为其他人详细描述了所有问题;但是在我清理完它之后,我从未在数百个安装中遇到数据库完整性问题。

它的一大优势是单个文件数据库,可以轻松备份,恢复和复制到您的笔记本电脑进行剖析。几乎所有的替代品,包括sqlite(虽然有些人不承认),偶尔需要某种形式的DBA注意。

在大多数情况下,Access默认为某些DDL(例如架构更改)提供记录锁和文件锁。

但微软基本上已经淘汰了它,你的一些同事会嘲笑你使用它。

(此时我通常会躲避掩饰并大喊“INCOMING !!!”。)

答案 3 :(得分:3)

Access实际上是一个桌面单用户解决方案。实际上,它的用户上限为“1”。

它也是本地引擎。也就是说,当您运行查询时,数据将通过网络传输到本地JET引擎进行处理。 .ldb文件放在网络共享上以控制锁。

如果您使用服务器端引擎(MSSQL,MySQL,Sybase,'Orable等),那么您将向处理它的引擎提交查询并将结果返回给您。锁在内部保存。

这对性能,稳定性和数据完整性具有重大意义。

如果您的用户决定按下重置按钮,Access数据库很可能会被破坏,您将不得不删除.ldb。

使用适当的数据库引擎(MSSQL,Sybase,'Orable:我不喜欢MySQL的备份),您还可以使用适当的备份功能。除非你有一些奇怪的软件来备份使用文件,否则你可能无法在Access DB中备份你的数据。

我特别提到了锁,因为数据库引擎可以比任何基于文件的系统更有效,更优雅地处理并发和事务。

我可以看到使用Access项目作为数据库引擎的前端,但不会投资使用Access后端的完整客户端应用程序。

答案 4 :(得分:3)

我一直在使用Access,或者更恰当地说,Jet作为一个非常小的私人网站的后端,这个网站永远不会增长,因为它受到这个小国家专业规模的限制。三年来我没有遇到任何问题。用户不到100个,每天大约有三十到四十个用户使用它。这些表有几千条记录。

答案 5 :(得分:2)

我对Access没有太多经验,但此链接可能对您有用:

http://office.microsoft.com/en-us/access/HP052408601033.aspx

“您可以将整个Access数据库放在网络服务器或共享文件夹中。这是最简单的实现方法。每个人都共享数据并使用相同的表单,报告,查询,宏和模块。策略如果您希望每个人都以相同的方式使用Access数据库,或者您不能支持用户创建自己的对象。“

“当您在共享模式下打开Access数据库文件(.mdb)时,Microsoft Access还会创建一个具有相同文件名的锁定信息文件(.ldb)(例如,Northwind.ldb)并在同一文件夹中数据库文件。此锁定信息文件存储数据库的每个共享用户的计算机名称(如mypc)和安全名称(如Admin).Microsoft Access使用此信息来控制并发。在大多数情况下,Microsoft Access会自动删除最后一个用户关闭数据库文件时的锁定信息文件。“

答案 6 :(得分:2)

访问应该是多用户的 - 我认为微软建议最多4或5个用户使用,但实际上我建议你永远不要使用只有一个用户的Access数据库,尽管如果鉴于某些条件,你真的没有选择它可以接受两三个。

我有使用Access数据库后端的四到五个系统的经验 - 所有这些系统都是从其他“开发人员”获得的 - 并且在所有情况下我都将它们作为优先级在任何即时更新之后移动到SQL Server在签订合同时需要修复 - 通常我会尽快与老板交账。这段时间通常是几个月,所以我看到它在几个不同的应用程序下运行并发一段合理的时间。

实际上,如果系统没有大量的并发插入/更新并且没有大量使用,它通常可以很好地工作。我的经验中的主要实际问题是..

  1. 它容易腐败 - 它就是这样。一般来说这不是一个问题,因为打开文件并运行紧凑和修复将解决问题,但一个良好的备份机制是绝对必要的。

  2. 这很慢。每次我将系统升级到SQL Server时,我都会收到很多赞誉,以加快用户的速度。

  3. 由于Access将记录标记为已更新或已删除的方式,数据库文件会膨胀。这会进一步降低系统速度,因为必须通过网络加载文件。因此,一些通常每天压缩数据的制度是必不可少的。

  4. 以上所有内容都不是单用户系统的问题,因为提示这些问题的根本问题不那么突出。

    总而言之,我必须强调,我永远不会推荐任何多用户系统的Access。但是,如果确实有这样的话,只要它是一个使用不多的应用程序,你就可以放弃它,并且你可以进行备份和维护程序。

答案 7 :(得分:1)

当使用网络共享时,我会使用支持网络的数据库(mysql / firebird / mssql)而不是访问权限。

对于您使用Access描述的情况不会有问题。

我已经在更具挑战性的情况下使用了Access,这主要是在使用Access时没有滥用Access的网站时,这实际上并不是数据库引擎的坏处。 (不是谈论形式和类似表格和记录的东西)

当您一次从多个用户进行插入/更新/删除时,它会变得有点毛茸茸。这是您开始考虑真实数据库引擎的关键所在。

此外,当您需要一个线程安全的低开销数据库时,您可以查看vistadb(访问速度较慢,而不是总是免费,100%.NET)

我认为访问使用表级锁与某种排队机制应该可以正常工作。 如果您担心它,您可以随时进行模拟压力测试。

答案 8 :(得分:1)

我认为您可以在.net应用程序连接字符串中定义它。我用google搜索JET,访问和记录锁定

这里有link可能会有帮助。

请参阅接受的答案,了解Access和JET如何获取数据的真实详情。

答案 9 :(得分:1)

已经多次声明使用真正的多用户免费数据库平台。但其中一个原因尚未说明。这个原因是,有多少现有的,凌乱的,麻烦的大型Access数据库已经开始作为“一些记录,最多一个或两个用户”?我冒昧地说出所有这些。

除非整个公司只有两三名员工,否则很可能是如果你开发了一个有用的软件,它最终会被原来的两三个用户使用,比原来的更多几千条记录,并将在几年内扩展,包括许多表格,更多表格和更多数据。建造房屋后,您无法重建房屋的基础。今天建立一个坚实的基础,你可以扩展你的心脏的内容。软件也一样。

答案 10 :(得分:-1)

请勿对多用户方案使用Access。

我刚刚经历了两个星期的痛苦,因为我的项目前任选择了Access作为后端。

具体原因:

  • 没有Linq-to-Access
  • 这样的东西
  • Access有很多怪癖,比如依赖于命令参数的添加顺序,这会花费你很多时间来调试
  • 访问权限无法扩展
  • 与使用SQL Server
  • 相比,数据库更新是一件苦差事