在存储过程调用期间,您何时可以看到更新、插入和删除的效果?

Posted

技术标签:

【中文标题】在存储过程调用期间,您何时可以看到更新、插入和删除的效果?【英文标题】:When can you see the effect of your update, insert and delete during a Stored Procedure call? 【发布时间】:2017-02-23 09:21:40 【问题描述】:

我有一个“SQL 服务器如何在内部工作”的问题。

如果我创建 4 个存储过程:

SP1 - FetchNamesFromSourceTable (takes 10 minutes to run)
SP2 - UpdateNamesWithAttendanceInfo (takes 5 minutes to run)
SP3 - AddAddressToNames (takes 8 minutes to run)

SP4 - RunUpdate which will run SP1, 2 and 3 in sequence.

现在,如果我们假设 SP 从表 OriginalNames 获取名称到表 NamesWithAttendanceAndAddresses(这只是一个示例),并且我们假设在我第一次运行时 NamesWithAttendanceAndAddresses 为空。

现在,如果我调用 SP4,然后在 16 分钟后从 NamesWithAttendanceAndAddresses 中选择 *,我会看到 SP1 和 SP2 的结果,还是在 SP4 完全运行之前在 NamesWithAttendanceAndAddresses 中看不到任何结果? ?

【问题讨论】:

这是关于 MS SQL 服务器的,所以这是 Transact SQL。 这取决于锁定、隔离级别等因素 【参考方案1】:

这一切都取决于事务隔离级别。而且,它与程序本身无关,而与交易有关。

在默认事务隔离级别(SQL Server 中的READ COMMITTED)及更高版本中,只有在 SP1 中的更新事务提交后,您的 SP4 才能看到 SP1 所做的更改。 SP1 本身是否返回无关紧要。

使用READ UNCOMMITTED 隔离级别(不推荐)SP4 将能够在内存中的数据页更新后立即看到更改的数据。

【讨论】:

SP4 以外的情况如何?如果我从 SP4 内部检查,我可以看到 SP1 的结果,但是如果我启动 SP4 并从外部检查,它仍然是一样的吗?我想,是的,但我不是 100% 确定。 这里的重点是,它实际上是 SP4、SP123 还是其他任何东西都无关紧要。如果修改数据的事务提交了更改,其他人都会看到它;如果尚未提交,则只有在READ UNCOMMITTED 隔离级别下运行的进程才能看到更改的数据。 (但它不是事务一致的,也可以回滚,所以...)

以上是关于在存储过程调用期间,您何时可以看到更新、插入和删除的效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在SSIS中调用函数或存储过程来使用拆分转换过滤和拆分数据?

NHibernate:在更新/删除/插入视图上映射的类时是否可以使用存储过程?

为啥在更新事务期间休眠调用删除?

在c#中调用带参数的存储过程

SQLServer 2008:来自 JAVA 的存储过程调用在执行插入和更新语句时返回错误

mysql 存储过程 若主键冲突则更新,不冲突则插入数据