2017-02-16 109 views
-2

我一直在阅读事务隔离级别,我不确定我是否正确理解所有内容。我需要帮助。事务隔离级别问题

请考虑以下Csharp的伪代码:

  1. 使用存储过程1,打开事务
  2. 插入或更新表1
  3. 使用存储过程2,插入或更新表2,基于数据在表1上
  4. 提交事务。

在步骤3中,我怎么能不考虑在步骤2中更新的数据?我应该在我的.Net代码中创建一个事务时设置事务隔离级别。这里是SQL服务器存储过程伪代码。

select @count=count(*) from table1; 
if @count > 1 
update table2 
+0

澄清;你希望第3步看到表1中的数据是否与第2步之前的数据相同? –

+0

@DanDef:在10000英尺高度,这是真的。在100英尺的高度上,第3步要多得多,因此步骤的顺序不能改变。 –

回答

1

只是改变顺序不能解决您的问题?我的意思是,如果步骤2更改了表1的数据,并且您完全需要执行步骤3,请先执行步骤3。它应该是这样的:

  1. 开放式交易
  2. 执行步骤2
  3. 执行步骤1
  4. 关闭交易

考虑你刚才评论的东西,你可能会需要使用IsolationLevel.Snapshot。但是,某些数据库默认情况下不会启用此功能。当你更新源表时,它基本上创建了一个到tempdb的当前数据的副本。

+0

在10,000英尺的高度,你是对的。在100英尺的高度上,第3步要多得多,因此步骤的顺序不能改变。 –

0

据我所知,没有任何隔离级别允许您在修改后访问行的先前版本。

要实现您所要求的,您需要修改第2步以跟踪其已更改的内容并使其可用于第3步。否则,您需要将触发器添加到在第2步中修改的表中,并且跟踪这种变化。