我想要做的是,告知用户有关我的程序“数据库中有更新正在进行,所以结果可能不正确“。因此,我必须检查我的程序使用的桌面上是否存在某些过程(如写入或删除)。SQL Server“正在检查数据库表如果有进程正在进行”
编辑:我更新我的表的方式是我使用MS Access,我从MS Excell约10,000行复制并使用MS Access将其粘贴到数据库。所以当复制粘贴正在进行时,我希望能够从我的基于Web的程序中看到它。
谢谢。
我想要做的是,告知用户有关我的程序“数据库中有更新正在进行,所以结果可能不正确“。因此,我必须检查我的程序使用的桌面上是否存在某些过程(如写入或删除)。SQL Server“正在检查数据库表如果有进程正在进行”
编辑:我更新我的表的方式是我使用MS Access,我从MS Excell约10,000行复制并使用MS Access将其粘贴到数据库。所以当复制粘贴正在进行时,我希望能够从我的基于Web的程序中看到它。
谢谢。
在某处(在此过程中,或者在服务器上,文件或共享内存等中)创建共享计数器。不要这样
increment the counter
query(UPDATE blablabla)
decrement the counter
你更新你就显露了消息,如果计数器大于0
(但是,这是你真正想要的是什么?见注释)
我不能肯定我明白你在这里想要达到的目标。
只要您使用合适的隔离级别,SQL Server就会为您管理数据的完整性和一致性。
所以,如果您的计数/报告查询试图访问当前正在更新的记录,它不会是能够获得一个共享锁(在记录目前正在更新),直到更新操作完成后,从而确保仅报告已提交的数据。因此,报告在完成时是正确的。
进一步的阅读可见:Transaction Isolation Levels
我编辑了关于如何编辑我的数据库的问题。 – stckvrflw 2010-07-05 06:19:08
更新,回复:
“编辑:我更新我的路表是我使用的MS Access,我从MS的Excell复制约10.000行并使用MS Access将其粘贴到数据库中,所以当复制粘贴进行时,我希望能够从我的基于Web的程序中看到它。“
原理相同,在粘贴过程开始时,添加一个DB行,就像在我的第一个答案中一样。或者,您可以在您的Web应用程序中设置一个全局变量,如updateInProgress = true
。
但是,这个副本需要多长时间?如果它少于5分钟,那么它可能不值得做其他事情。
如果你只是想让用户知道有“新鲜”的数据,你可以查询最近的日期时间。
什么样的更新?
通常情况下,SQL Server通过默认事务锁定保持结果准确。
也许你的意思是一个长时间的数据导入工作?或者,天堂禁止,一些密集的,光标驱动的过程?
然后,你可以这样做:
在数据库中创建一个表。称之为LongJobLog。它可能有3列:一个ID,一个开始日期时间和一个结束日期时间。
在每个长作业开始时,向该表添加一个新的开始时间,确保将新ID保存到一个变量中。
作业结束或出错时,使用endtime更新ID的行。
您的应用程序将查询此表以查找仍有空结束时间的最近行(按开始时间)。如果存在这样的行,则“更新”正在进行中。
您可能需要cron作业来清除作业崩溃的条目。
或者,此启动停止信息可能在SQL日志中可用。不过,可能需要一些工作来整理。
我编辑了关于如何编辑我的数据库的问题。 – stckvrflw 2010-07-05 06:19:32
难道你不能这样做,使得更新永远不会与读取同时发生,例如事务? – 2010-07-02 12:43:30