2016-06-14 74 views
-1

我正在处理会计项目并面临并发更新问题。我按照下面方案
1)用户1检索COLUMN1数据
2)用户2还检索COLUMN1数据
3),同时更新用户2列1的数据用户1更新列1数据
4)我必须告诉用户列1的数据是已经更新请刷新细节&如果从原始修改更新。并发问题,当更新sql服务器表列

,我不希望从检索其已经被用户1,检索如何处理这种类型的并发或任何内建的功能在SQL Server中提供的数据限制用户2

+0

您可以[设置事务隔离级别(http://sqlperformance.com/2014/07/t-sql-queries/isolation-levels) – stuartd

回答

2

重申你的问题我的理解是:

  1. 用户1 retrived COLUMN1数据
  2. 用户2也retrived COLUMN1数据
  3. 用户1更新COLUMN1数据
  4. 用户2要更新列1上的陈旧数据。您希望提醒用户2数据已过时,用户2应该执行刷新(获取最新值),然后再次更新。

这正是rowversion的用途。您将此记录添加到新记录中。每当数据在记录上发生变化时,Sql服务器将处理分配值并增加它们。您应该检索该值以及该记录的其他相关详细信息,然后将其包含在更新声明中。如果值不匹配,则表示存在并发性错误,则记录在用户检索数据的最后一次和希望更新数据的时间之间更新。

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

在表中执行rowversion后的逻辑。

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