SQL Server“检查数据库表如果表上有进程”

时间:2010-07-02 12:39:15

标签: c# sql-server sql-server-2000

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

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

感谢。

3 个答案:

答案 0 :(得分:3)

我不确定我理解你在这里想要达到的目标。

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

因此,如果您的计数/报告查询尝试访问当前正在更新的记录,则在更新操作完成之前,它将无法获取共享锁(在当前正在更新的记录上),从而确保仅报告已提交的数据。因此,报告在完成时是正确的。

如需进一步阅读,请参阅:Transaction Isolation Levels

答案 1 :(得分:0)

更新,重新:

  

“编辑:我更新表格的方式是使用MS Access,我从MS Excell复制大约10.000行并使用MS Access将其粘贴到数据库中。所以当复制粘贴正在进行时,我想成为能够从我的网络程序中看到它。“

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

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

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


什么样的更新?在通常意义上,SQL Server通过默认事务锁定保持结果准确。

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

然后你可以这样做:

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

  2. 在每个长作业开始时,为此表添加新的开始时间,请务必将新ID保存到变量中。

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

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

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

  6. 或者,可以在SQL日志中使用此启停信息。但是,可能需要一些工作来解决它。

答案 2 :(得分:-1)

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

increment the counter
query(UPDATE blablabla)
decrement the counter

然后,如果计数器大于0,则显示消息。

(但这是你真正想要的吗?见评论)