取消数据库查询的困境

3
也许这是一个被问了很多次的问题,但经过大量搜索和阅读后,我仍然不确定什么是最好的方法。
问题很简单:我的应用程序中一些数据库事务很长(几秒钟,几分钟)。这可能是两个原因:单个查询要处理大量数据或在一系列检索到的数据上执行多个查询。在许多情况下,两种情况都会出现。这会挂起用户界面,更糟糕的是他无法取消此操作。
解决方案似乎也很简单:将这些事务移动到另一个线程中,然后在需要时销毁该线程。
但是,互联网上的许多人反对杀死线程。他们建议使用DbCommand.Cancel(),这是一个线程安全的操作。但是,其他人说没有保证该命令将取消查询。甚至还有更大的问题:当用户点击时,UI线程如何知道哪个DbCommand正在执行?线程可能正在处理内存中的数据。
你能为这个问题提供任何帮助吗?
1个回答

2

无法保证该命令将取消查询

这取决于提供程序。有些提供程序不支持取消命令,但是SQL Server支持,所以这不应该成为问题。当然,还取决于正在执行的命令类型...

更大的问题是:UI线程如何知道用户单击时正在执行哪个DbCommand?

DbCommand.Cancel 是一个实例方法,而不是静态方法...因此,您需要保留对正在执行的命令的引用,并在该实例上调用cancel。


保持引用并不是一件容易实现的事情。它需要仔细同步,并在代码中引入锁。至少,这是我的理解。 - Nezreli
你确定我们在谈论同一件事吗?保留引用只是将DbCommand存储在变量或字段中,这不会成为问题,我不明白它怎么可能是个问题。 - Thomas Levesque
工作线程可能在给定的时刻执行大量查询,这意味着它会不断更新引用。UI 线程可能会获取到已经被处理的命令的引用。 - Nezreli
当然,但是无论如何,如果你想要取消一个命令,没有其他方法:你必须知道你想要取消哪个命令。 - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接