2011-07-06 53 views
0

我有msaccess数据库连接到sql server通过链接表使用“sql server”odbc驱动程序。除了涉及交易时,它大多运作良好。msaccess odbc到sqlserver 2005锁定:超时

问题我想不通一种解决方法是“锁:超时”,当MSACCESS形式决定对自己进行刷新,而大交易正在处理(10-30秒)发生。

如果msaccess尝试击中被事务锁定的行,sql分析器会立即显示Lock:Timeout,但MSAccess无法处理此事件,并锁定应用程序直至其自身的querytimeout过期(60秒)。愚蠢的是,它也暂停了VBA,因此交易无法完成。

除了关闭在这些批次中打开的所有表单之外,我该怎么办?

如果我能设置的ODBC连接的是MSSQL锁定超时,该交易可能有机会来完成,但似乎并没有成为这个连接字符串参数。这很棘手,因为MSAccess的背景行为大多不受我的控制。我很确定没有可以为sql数据库设置的全局锁定超时。

任何想法? 谢谢 卢克

回答

0

而不是使用msaccess currentproject.connection,我直接启动一个新的ADODB连接到SQL服务器,然后设置锁定超时。例如 cnn.execute "set lock_timeout 1000"。然后,当连接超时失效时,这个连接将会抛出一个错误 - 你可以捕获这个错误。这个缺点是你必须把jet sql翻译成tsql。好处是你可以把翻译好的tsql放到存储过程中,让它运行得更快。

我发现了一些技巧,以减少锁定MSACCESS并试图通过把一个事务之前的量。在开始事务之前加入一个doevents有助于控制 - 它可以让控制返回到msaccess,以便它可以赶上它可能正在进行的任何异步刷新。

在另一个例子中,我有一个计算列,它花了很长一段时间后me.refresh计算(3-5秒)。我需要那个。刷新并且正在寻找比禁用控制更好的解决方案。我发现如果在捕获一个锁定错误后重试事务,只要我在每个语句之间都有一个doevents,它就会在5次尝试中工作。然后我发现这种延迟通常会让msaccess完成这件事。

tt = Timer: Do While Timer - tt < 5: DoEvents: Loop 

这样的麻烦是你不知道等待多长时间。因为我不喜欢反复重复交易,所以我添加了一个可以忍受的等待,这个等待在大多数情况下都足够了,当我不把错误丢回给用户重新尝试时。

我希望有一种方式来获得访问完事,放弃其锁并一度保持沉默。

+0

这是否适用于ODBC链接表以及在其上创建的DAO记录集? –

+0

我假设你的意思是使用dao和msaccess的当前连接。我真的不知道如何设置这些锁定超时。我相信在locktimeout发生后它会很好地运行currentdb.querytimeout。我正在用半打自动化虚拟机来压力测试我的数据库,并且我不能在我的生活中弄清楚如果某些事情被另一个客户端锁定,如何及时使msaccess超时。我想这是另一个问题。尽管微软在2006年发表了Andy Baron的论文,但我开始怀疑msaccess和odbc在多用户环境中的可行性。 –

+0

好吧,有很多DAO记录集没有在代码中明确创建。例如,当您分配使用ODBC链接表的窗体的记录集时,窗体的.Recordset属性是一个DAO记录集。所以,我的问题是ADO超时设置与Access中所有ADO记录集根本不涉及(因为ADO没有涉及数据访问)的地方有什么关系? –

0

我找到了一个更好的办法是派遣VBA计算结果未绑定到任何MSACCESS界面对象的服务器端表,然后再打一个“终结”过程,它使用该表来更新其他表,可能是界。

由于所有的时间都在vba中并将结果发送到服务器,所以最终处理过程很快,所以可以重复执行,直到放弃锁定为止,且客户端等待时间可以忽略不计。

在服务器端表中数据的前后存储允许检测在vba计算过程中可能被另一个进程更改的行。这样可以避免长时间锁定任何内容,从而在无法处理服务器锁定超时时增加msaccess冻结的风险。

如果在finalization proc的事务期间发生表单刷新(在2k3和2k7版本中确认),但是msaccess冻结仍然可能发生,但它无法阻止此proc完成,因此更糟糕的是,会导致一分钟的延迟客户。