我正在使用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看起来非常好。 任何人都可以帮忙解决这个问题吗?
答案 0 :(得分:0)
1 /想法是SQL Server可能决定在某些条件下锁定整个表(例如服务器上缺少资源)。
2 /一个想法可能是将UStatus_OPDatum列中的值存储到变量中,然后执行单个UPDATE语句。
3 /此外,您应该尽可能晚地启动事务,这样您就可以从more business logic goes here
中提取一些SELECT语句并在开始事务之前执行它们。
4 /愚蠢的问题:你确定你是这个代码的单身人士吗?