2010-07-02 60 views
2

我想要做的是,告知用户有关我的程序“数据库中有更新正在进行,所以结果可能不正确“。因此,我必须检查我的程序使用的桌面上是否存在某些过程(如写入或删除)。SQL Server“正在检查数据库表如果有进程正在进行”

编辑:我更新我的表的方式是我使用MS Access,我从MS Excell约10,000行复制并使用MS Access将其粘贴到数据库。所以当复制粘贴正在进行时,我希望能够从我的基于Web的程序中看到它。

谢谢。

+0

难道你不能这样做,使得更新永远不会与读取同时发生,例如事务? – 2010-07-02 12:43:30

回答

-1

在某处(在此过程中,或者在服务器上,文件或共享内存等中)创建共享计数器。不要这样

increment the counter 
query(UPDATE blablabla) 
decrement the counter 

你更新你就显露了消息,如果计数器大于0

(但是,这是你真正想要的是什么?见注释)

+1

永远不要实现你自己的锁定 – gbn 2010-07-02 13:25:00

+0

@gbn为什么不呢?有时您需要做的不仅仅是更新数据库(写入常规文件或其他),在这种情况下,使用数据库提供的功能是没有意义的。 – 2010-07-02 14:38:09

+1

你的锁定表上的并发问题会有同样的问题......如果你不想等,你可以设置@@ locktimeout为例。同样在这种情况下,客户端命令超时会发生什么?你的计数器保持> 0 =拧紧... – gbn 2010-07-02 14:48:17

3

我不能肯定我明白你在这里想要达到的目标。

只要您使用合适的隔离级别,SQL Server就会为您管理数据的完整性和一致性。

所以,如果您的计数/报告查询试图访问当前正在更新的记录,它不会是能够获得一个共享锁(在记录目前正在更新),直到更新操作完成后,从而确保仅报告已提交的数据。因此,报告在完成时是正确的。

进一步的阅读可见:Transaction Isolation Levels

+0

我编辑了关于如何编辑我的数据库的问题。 – stckvrflw 2010-07-05 06:19:08

0

更新,回复:

“编辑:我更新我的路表是我使用的MS Access,我从MS的Excell复制约10.000行并使用MS Access将其粘贴到数据库中,所以当复制粘贴进行时,我希望能够从我的基于Web的程序中看到它。“

原理相同,在粘贴过程开始时,添加一个DB行,就像在我的第一个答案中一样。或者,您可以在您的Web应用程序中设置一个全局变量,如updateInProgress = true

但是,这个副本需要多长时间?如果它少于5分钟,那么它可能不值得做其他事情。

如果你只是想让用户知道有“新鲜”的数据,你可以查询最近的日期时间。


什么样的更新? 通常情况下,SQL Server通过默认事务锁定保持结果准确。

也许你的意思是一个长时间的数据导入工作?或者,天堂禁止,一些密集的,光标驱动的过程?

然后,你可以这样做:

  1. 在数据库中创建一个表。称之为LongJobLog。它可能有3列:一个ID,一个开始日期时间和一个结束日期时间。

  2. 在每个长作业开始时,向该表添加一个新的开始时间,确保将新ID保存到一个变量中。

  3. 作业结束或出错时,使用endtime更新ID的行。

  4. 您的应用程序将查询此表以查找仍有空结束时间的最近行(按开始时间)。如果存在这样的行,则“更新”正在进行中。

  5. 您可能需要cron作业来清除作业崩溃的条目。

或者,此启动停止信息可能在SQL日志中可用。不过,可能需要一些工作来整理。

+0

我编辑了关于如何编辑我的数据库的问题。 – stckvrflw 2010-07-05 06:19:32

相关问题