MS-Access外部事务锁定SQL Server表

时间:2014-04-10 17:06:58

标签: sql sql-server transactions access-vba ms-access-2003

我正在使用mdb + DAO转换大型MS-Access应用程序以使用SQL Server作为后端。 到目前为止,我有合理的成功,但这是一个相当噩梦的项目。 现在有些事情让我在过去的3天里难过了:

在Access中,我有以下代码片段(为简洁起见):

Set oWS = DBEngine.Workspaces(0)
oWS.BeginTrans: bInTrans = True
sql = "UPDATE Artikels SET Status_OP = True, Status_OPDatum = #10/04/2014# WHERE Artikelnummer = 50808"
CurrentDb.Execute sql, dbFailOnError

'>> a bunch more business logic goes here

sql = "UPDATE Artikels SET Creatiedatum = #15/11/2002 00:00:01#, Inputdatum = #11/06/2013 15:44:35#, Stockdatum = #28/02/2014 16:16:05#, [Stockdatum A] = #21/06/2011 16:28:59#, Verkoopdatum = #23/10/2013 10:35:06#, Wijzigdatum = #10/04/2014 12:47:18# WHERE Artikelnummer = 50808"
CurrentDb.Execute sql, dbFailOnError
oWS.CommitTransaction

执行第二个语句时,应用程序将锁定,直到SQL Server报告事务超时。 在执行第一个语句后,我立即注意到Sql Server在表Artikels上放置了一个IX锁定,这显然导致第二个语句失败。

当我删除交易时,一切运行正常。但是,所有语句都必须是一个事务的一部分(为简洁起见,省略了回滚BL。)

我一直在阅读很多隔离级别,但我觉得这不是解决方案的来源。默认的READ COMMITTED看起来非常好。 任何人都可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

1 /想法是SQL Server可能决定在某些条件下锁定整个表(例如服务器上缺少资源)。

2 /一个想法可能是将UStatus_OPDatum列中的值存储到变量中,然后执行单个UPDATE语句。

3 /此外,您应该尽可能晚地启动事务,这样您就可以从more business logic goes here中提取一些SELECT语句并在开始事务之前执行它们。

4 /愚蠢的问题:你确定你是这个代码的单身人士吗?