我有一个事务隔离级别设置为Read Uncommitted的SP。 例如
Create Procedure TrailSP
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
UPDATE TrialTable
SET TrailColumn ='Update'
WHERE TrailID=1
--this is followed by more updates and selects
END TRY
BEGIN CATCH
RETURN -1;
END CATCH
RETURN 0;
我想知道的是,我在SP中给出的第一个更新将在执行时立即提交,或者在Sp结束时与其余逻辑一起提交。
答案 0 :(得分:2)
当事务提交时,它将作为任何事务隔离级别下的任何更新提交。这与 nothing 有关的存储过程结束。
如果对您的过程的调用有一个事务,那么当 事务提交时,将发生提交。
如果对您的过程的调用没有事务但会话已启用implicit transactions,则它将在应用程序显式提交时提交。
如果对您的过程的调用没有事务并且会话具有自动提交事务行为(即最常见的情况),那么当UPDATE语句完成时,事务将提交。
为UPDATE启用READ UNCOMMITTED是一个无操作。
答案 1 :(得分:0)
- 在READ UNCOMMITTED中读取的任何数据都是可能因为写入它的事务回滚而消失的数据。
- 它也可能看不到某些已提交的行,因为尚未提交但可能永远不会提交的事务将其删除。
- 由于PageSplit,行也可能丢失或重复。
基本上任何事情都是可能的,因此读取的数据永远不应用于计算应写入数据库的任何内容,否则可能会破坏数据库。
TLDR:永远不要使用READ UNCOMMITTED