【问题标题】:Transaction Isolation Level issue事务隔离级别问题
【发布时间】:2017-07-06 03:44:20
【问题描述】:

我一直在阅读有关事务隔离级别的信息,但我不确定我是否正确理解了所有内容。我需要帮助。

请考虑以下 Csharp 伪代码:

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

在第 3 步中,如何不考虑第 2 步中已更新的数据?在 .Net 代码中创建事务时是否应该设置事务隔离级别。这是SQL Server存储过程的伪代码。

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

【问题讨论】:

  • 澄清一下;您希望第 3 步查看表 1 中的数据,就像在第 2 步之前一样?
  • @DanDef:在 10,000 英尺的高度,这是真的。在 100 英尺的高度上,步骤 3 的作用要大得多,因此步骤的顺序无法更改。

标签: c# sql-server tsql transactions isolation-level


【解决方案1】:

仅仅更改顺序并不能解决您的问题?我的意思是,如果第 2 步更改了表 1 的数据,并且您需要它完整地执行第 3 步,请先执行第 3 步。它看起来像这样:

  1. 打开交易
  2. 执行程序 2
  3. 执行程序 1
  4. 关闭交易

考虑到您刚刚评论的内容,您可能需要使用IsolationLevel.Snapshot。但是,某些数据库默认没有启用此功能。当您更新源表时,它基本上创建了当前数据的副本到 tempdb。

【讨论】:

  • 在 10,000 英尺的高度,您是对的。在 100 英尺的高度上,步骤 3 的作用要大得多,因此步骤的顺序无法更改。
【解决方案2】:

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

要实现您的要求,您需要修改第 2 步以跟踪它的更改并使其可用于第 3 步。否则,您需要将触发器添加到第 2 步中修改的表并跟踪以这种方式进行更改。

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2011-09-30
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2020-06-07
    相关资源
    最近更新 更多