我已经设计数据库表格(正常化,在一个MS SQL服务器)以及创建一个独立的窗户的前端应用程序,通过将用于极少数用户增加和编辑的信息。我们将增加一个网络接口,以允许搜查跨越我们的生产区在稍后的日期。

我感到关切的是,如果两个用户开始编辑的同一记录的最后提交的更新将是'胜者'和重要的信息可能丢失。一些方案来介意但是我不确定如果我要创建一个更大的头痛的问题。

  1. 什么也不做,并希望这两个用户都从未被编辑的录相同,在同一时间。 -永远不可能君但是,如果它不会吗?
  2. 编辑程序可能储存的副本的原始数据以及更新和随后进行比较时,用户有完成的编辑。如果他们不同,显示用户,并确认更新 -需要两个拷贝的数据将被存储。
  3. 添加的最后一次更新日期时间列和检查匹配当我们的更新,如果不那么显示的差异。 -需要新列在每个相关的表格。
  4. 创建一个编辑表格,注册用户使用时开始编辑的记录,这将是检查和防止其他用户编辑的同一记录。 -就需要小心想到的程序流程,以防止死锁和记录成为锁定如果一个用户提出的程序。

是否有任何更好解决方案,或者我应该去这个吗?

有帮助吗?

解决方案

如果你希望不经常碰撞, 乐观的并发 可能是你最好的选择。

斯科特*米切尔写了一个全面的教程在实施这一模式:
实现乐观的并发

其他提示

一个典型做法如下:

  • 加布尔的领域,"锁定"对各表。
  • 设置这个虚假的默认。
  • 当用户开始编辑,你这样做:

    • 锁的行(或整个表格如果你不能锁定行)
    • 检查的标志在行你想要的编辑
    • 如果标志是真的然后
      • 通知用户,他们无法编辑这行的时刻
      • 设置标志真的
    • 释放锁

    • 在保存记录、设置标志回false

选择用于更新和等是很好的提供住锁的显微量的时间,但对于一个宏观的金额(例如用户有加载的数据和没有压'节省'你应该使用乐观的并发作为以上。(而我总是觉得是名不副实的-这是比较悲观,比的最后一个作家胜利',这通常是唯一的其他替代的考虑。)

@标哈里森:SQL服务器不支持法(SELECT ... FOR UPDATE).

SQL服务器上等同的是 SELECT 声明的提示 UPDLOCK.

看看 SQL服务器在线书籍 更多的信息。

-首先建立提出申请(更新时间)储存最新记录 -当的任何用户选择的记录保存选择的时间, 比较之间选择的时间和更新时间的领域,如果(更新时间)>(选择时间),意味着另一个用户更新这一纪录后的选择记录

另一种选择是来测试,值的记录得你是变化的仍然相同,因为他们当你开始:

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发言和发表的通行证 新的 领域所存储的过程。

它还具有优点,你是不是锁定的记录,因为我们都知道,记录将最终锁住的时候他们不应该...

该数据库将为你做这个。看"选择...用于更新",其目的是只是对于这种事情。它会给你写锁上选择行,然后你就可以提交或滚回来。

我,最好的办法,我有一个列lastupdate(timetamp数据类型).当选择和更新的,只是比较这个的价值 另一个提前的这个方案是,可以使用这个列为追踪数据的时间有变化。我认为这是不好的如果你只是创建一个柱状isLock为检查更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top