我设计了数据库表(在MS SQL服务器上规范化),并为一个应用程序创建了一个独立的Windows前端,供少数用户用来添加和编辑信息。 我们将添加一个Web界面,以便日后在我们的生产区域进行搜索。

我担心如果两个用户开始编辑相同的记录,那么提交更新的最后一个将是“赢家”,重要信息可能会丢失。 我想到了许多解决方案,但我不确定是否会引起更大的麻烦。

  1. 什么都不做,希望两个用户永远不会同时编辑同一条记录。 - 可能永远不会发生但是如果它发生了什么?
  2. 编辑例程可以存储原始数据的副本以及更新,然后在用户完成编辑时进行比较。 如果它们不同则显示用户和确认更新- 需要存储两个数据副本。
  3. 添加上次更新的DATETIME列并在更新时检查它是否匹配,如果没有则显示差异。 - 每个相关表格都需要新列。
  4. 创建一个编辑表,用于在用户开始编辑将要检查的记录时注册,并阻止其他用户编辑同一记录。 - 如果用户崩溃了程序,则需要仔细考虑程序流以防止死锁和记录被锁定。

有没有更好的解决方案,还是应该选择其中一种?

===============>>#1 票数:15 已采纳

如果您预计不常发生冲突, 乐观并发可能是您最好的选择。

Scott Mitchell编写了一个关于实现该模式的综合教程:
实现乐观并发

===============>>#2 票数:2

一种经典的方法如下:

  • 添加一个布尔字段,“锁定”到每个表。
  • 默认情况下将此值设置为false。
  • 当用户开始编辑时,您执行以下操作:

    • 锁定行(如果你不能锁定行,则锁定整个表)
    • 检查要编辑的行上的标志
    • 如果标志是真的那么
      • 告知用户他们此刻无法编辑该行
    • 其他
      • 将标志设置为true
    • 释放锁

    • 保存记录时,将标志设置为false

===============>>#3 票数:1

另一个选项是测试您正在更改的记录中的值是否与启动时的值相同:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(显示customer_nm字段,用户更改它)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

您不必到新列添加到您的表(并保持最新的),但你必须创建更详细的SQL语句,并通过 领域的存储过程。

它还有一个优点,就是你没有锁定记录 - 因为我们都知道记录最终会在它们不应该被锁定时保持锁定状态。

===============>>#4 票数:1

SELECT FOR UPDATE和等价物是很好的,只要您在很短的时间内保持锁定,但是对于宏观数量(例如,用户已加载数据并且没有按下'保存',您应该使用上面的乐观并发。(其中我一直认为是错误的名字 - 它比“最后一位作家获胜”更悲观,这通常是唯一考虑的其他选择。)

===============>>#5 票数:1

@Mark Harrison:SQL Server不支持该语法( SELECT ... FOR UPDATE )。

SQL Server等效的是SELECT语句提示UPDLOCK

有关更多信息,请参见SQL Server联机丛书

===============>>#6 票数:1

-first创建存档(更新时间)以存储最后更新记录 - 当任何用户选择记录保存选择时间时,在选择时间和更新时间字段之间进行比较if(更新时间)>(选择时间)表示另一个用户在选择后更新此记录记录

===============>>#7 票数:0

对我来说,最好的方法是我有一个lastupdate列(timetamp数据类型)。 当select和update只是比较这个值时,此解决方案的另一个进步是您可以使用此列来跟踪数据更改的时间。 我认为,如果您只是为了检查更新而创建像isLock这样的列,那就不好了。

===============>>#8 票数:0

数据库将为您执行此操作。 看看“选择...更新”,这是专门为这种事情设计的。 它将为您提供所选行的写锁定,然后您可以提交或回滚。

  ask by Swinders translate from so

未解决问题?本站智能推荐: