事务隔离级别问题
问题描述:
我一直在阅读事务隔离级别,我不确定我是否正确理解所有内容。我需要帮助。事务隔离级别问题
请考虑以下Csharp的伪代码:
- 使用存储过程1,打开事务
- 插入或更新表1
- 使用存储过程2,插入或更新表2,基于数据在表1上
- 提交事务。
在步骤3中,我怎么能不考虑在步骤2中更新的数据?我应该在我的.Net代码中创建一个事务时设置事务隔离级别。这里是SQL服务器存储过程伪代码。
select @count=count(*) from table1;
if @count > 1
update table2
答
只是改变顺序不能解决您的问题?我的意思是,如果步骤2更改了表1的数据,并且您完全需要执行步骤3,请先执行步骤3。它应该是这样的:
- 开放式交易
- 执行步骤2
- 执行步骤1
- 关闭交易
考虑你刚才评论的东西,你可能会需要使用IsolationLevel.Snapshot。但是,某些数据库默认情况下不会启用此功能。当你更新源表时,它基本上创建了一个到tempdb的当前数据的副本。
+0
在10,000英尺的高度,你是对的。在100英尺的高度上,第3步要多得多,因此步骤的顺序不能改变。 –
答
据我所知,没有任何隔离级别允许您在修改后访问行的先前版本。
要实现您所要求的,您需要修改第2步以跟踪其已更改的内容并使其可用于第3步。否则,您需要将触发器添加到在第2步中修改的表中,并且跟踪这种变化。
澄清;你希望第3步看到表1中的数据是否与第2步之前的数据相同? –
@DanDef:在10000英尺高度,这是真的。在100英尺的高度上,第3步要多得多,因此步骤的顺序不能改变。 –