在读取未提交的事务中更新

Update inside a read uncommitted transaction

我有一个事务隔离级别设置为未提交读取的 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 结束时与其余逻辑一起提交。

事务提交时,它将被提交,就像任何事务隔离级别下的任何更新一样。这与存储过程结束没有任何关系

如果对您的过程的调用有一个事务,那么提交将在 那个 事务提交时发生。

如果对您的过程的调用没有事务但会话已启用 implicit transactions 那么它会在应用程序明确提交时提交。

如果对您的过程的调用没有事务并且会话具有自动提交事务行为(即最常见的情况),那么事务将在 UPDATE 语句完成时提交。

为 UPDATE 启用 READ UNCOMMITTED 是空操作。

-在 READ UNCOMMITTED 中读取的任何数据都是可能会消失的数据,因为写入它的事务会回滚。

-也可能看不到某些已提交的行,因为尚未提交且可能永远不会提交的事务将其删除。

-也可能因为分页导致行丢失或重复。

基本上一切皆有可能,因此读取的数据永远不应用于计算应写入数据库的任何内容,否则您有损坏数据库的风险。

TLDR:永远不要使用 READ UNCOMMITTED