读取未提交的事务内部更新

时间:2015-02-17 10:04:30

标签: sql sql-server tsql transactions

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

2 个答案:

答案 0 :(得分:2)

事务提交时,它将作为任何事务隔离级别下的任何更新提交。这与 nothing 有关的存储过程结束。

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

如果对您的过程的调用没有事务但会话已启用implicit transactions,则它将在应用程序显式提交时提交。

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

为UPDATE启用READ UNCOMMITTED是一个无操作。

答案 1 :(得分:0)

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

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

- 由于PageSplit,行也可能丢失或重复。

基本上任何事情都是可能的,因此读取的数据永远不应用于计算应写入数据库的任何内容,否则可能会破坏数据库。

TLDR:永远不要使用READ UNCOMMITTED