ADO.net 是仅在指定的存储过程调用之后返回结果,还是等到所有触发器都执行后才返回结果?
Posted
技术标签:
【中文标题】ADO.net 是仅在指定的存储过程调用之后返回结果,还是等到所有触发器都执行后才返回结果?【英文标题】:Does ADO.net return results after the specified stored procedure call only or does it wait until all triggers are executed? 【发布时间】:2011-09-26 01:54:38 【问题描述】:我正在尝试记录数据库中 nvarchar(max) 字段中使用的每个单词,每个单词都将成为一个数据行,并且在一个存储过程中执行此操作需要很多时间。所以我创建了另一个存储过程,它将所有单词作为新数据行添加到另一个表中,但这需要很长时间,我不希望用户等待这个操作。我的解决方案是在单独的进程(system.thread)中运行耗时的插入查询,但现在我正在考虑触发器。如果我触发在触发器中插入所有单词,用户是否仍会等待所有插入查询,包括触发器?还是 sql 会运行存储过程,将结果返回给用户,然后触发器会运行?假设触发器在触发器之后。
【问题讨论】:
Asynchronous Triggers in SQL Server 2005/2008的可能重复 【参考方案1】:没错——存储过程一直等到触发器完成(以支持事务提交/回滚)。如果您需要异步行为,您可以摆脱触发器并使用 SQL Server 服务代理以异步方式处理它。查看此thread 了解更多信息。
【讨论】:
【参考方案2】:触发器将与存储过程一起按顺序运行,用户必须等待 m 完成。
您要么希望按照您的指示在单独的线程中运行存储过程,要么按计划运行单独的后台进程以提取更新的记录,然后延迟将更新应用于相关表。像这样批量更改可以提高整体性能,但这意味着数据完全更新时的延迟会更长。
另一件需要注意的事情是,如果您适当地利用缓存,单词表是否已完全规范化。也许您可以简单地加快这些插入速度,这样就可以解决问题,而不会出现多线程的复杂性或延迟。
【讨论】:
谢谢。我想我会继续在 .net 中使用 system.thread以上是关于ADO.net 是仅在指定的存储过程调用之后返回结果,还是等到所有触发器都执行后才返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
ADO.NET 调用 T-SQL 存储过程会导致 SqlTimeoutException