在存储过程调用期间,您何时可以看到更新、插入和删除的效果?
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:在更新/删除/插入视图上映射的类时是否可以使用存储过程?