更新sql server表列时的并发问题

时间:2016-06-14 12:52:31

标签: c# sql-server-2012

我正在从事会计项目并面临并发更新问题。我遵循了以下场景
1)User1检索column1数据
2)User2还检索column1数据
3)User1更新column1数据
4)在更新User2 column1数据时我必须告诉用户column1数据已经更新请刷新详细信息&如果从原始版本修改,则更新。

并且我不想限制 User2 检索已经由 User1 检索的数据,如何处理此类型的并发或任何内置函数在SQL Server中可用吗?

1 个答案:

答案 0 :(得分:2)

按照我的理解重申你的问题:

  
      
  1. User1被重新检索column1数据
  2.   
  3. User2也是已经重试的column1数据
  4.   
  5. User1更新了column1数据
  6.   
  7. User2想要更新column1上的陈旧数据。您想提醒用户2数据是陈旧的,用户2应该刷新(获取最新值),然后可以再次更新。
  8.   

这正是rowversion的用途。您将此作为新列包含在记录中。每次数据在记录上发生更改时,Sql server都会处理赋值并递增它们。您应该检索此值以及该记录的其他相关详细信息,然后将其包含在更新语句中。如果值不匹配,则会出现并发错误,记录会在用户上次检索数据和更新数据的时间之间进行更新。

另请注意,在这种情况下,只要对记录进行任何更改,rowversion就会被更改,而不仅仅是针对该特定列。

在表格中实现rowversion后的逻辑。

  1. 任何用户检索column1数据也会检索记录的rowversion值
  2. 任何用户更新column1数据都包含WHERE语句的UPDATE子句中的rowversion值。
    1. 如果受影响(更新)的记录数为0,则不会发生更新,因为记录已由检索和更新之间的另一个连接更新。在这种情况下,执行逻辑以显示错误消息并检索更新的数据以及新的rowversion值。 (或者删除了记录,但我们假设情况并非如此)。
    2. 如果受影响(更新)的记录数为1,则更新成功。记录的rowversion值也发生了变化。如果要在没有完整数据刷新的情况下允许其他更新,请务必将更新的rowversion返回给用户。