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