如何防止多个数据库用户覆盖彼此的数据?

时间:2008-10-03 14:57:24

标签: sql

如果两个用户访问同一个数据库表,我们如何防止用户覆盖彼此的数据?

6 个答案:

答案 0 :(得分:2)

查看This discussion,了解应用程序中数据库锁定的不同策略或技术。

答案 1 :(得分:1)

没有直接的方法可以做到这一点。您可以使用事务来确保正确解析更新(即您没有获得部分更新),但您可能会丢失第一组更改,因为它将被第二组更改。

您可能有两个选择:

  • 在应用程序级别实现一些锁定机制(即,当有人开始编辑记录时,会在某处阻止其他用户执行相同的操作)
  • 实现版本控制,因此每次有人写入数据库时​​都会创建 new 记录。这样,两组数据都将存储在数据库中,您可以在应用程序中使用逻辑来合并它们或选择您喜欢的数据

答案 2 :(得分:1)

嗯,这取决于。当您编辑表格时,它不像在MSWord中打开文件或其他东西。

您发出的命令一次只能专门添加或更改一行或一组行,因此除非两个人正在编辑同一行,否则将保留两个用户的更改。

在您执行操作时(或在事务中),也可以隐式锁定表,或者如果您确切知道要阻止编辑的内容,也可以显式锁定表。大多数数据库都提供“行级锁定”,这意味着不需要为每个操作锁定整个表。

当你开始考虑交易和MVCC时会变得更加复杂。如果您让我们了解您感兴趣的具体情况,我们可以为您提供更具体的帮助。

答案 3 :(得分:1)

某些数据库服务器支持如下构造:

SELECT column FROM table WHERE something = 'whatever' FOR UPDATE;

将锁定select返回的所有行,直到发出COMMIT或ROLLBACK。

MySQL(InnoDB)和Oracle是支持此功能的两个数据库。

答案 4 :(得分:0)

我遇到的最简单的方法是使用一个名为last_actv_dtm的附加字段,每当有人修改记录时,该字段就会更新。假设您的应用程序首先查询记录,那么您应该拥有正在修改的记录的last_actv_dtm

使用此SQL执行更新。

UPDATE tab1
SET
    col1 = ?
    , col2 = ?
    , last_actv_dtm = GETDATE()
WHERE
    pkcol = rec.pkcol
    AND last_actv_dtm = rec.last_actv_dtm;

如果自应用程序选择记录以来尚未修改该行,则只会更新该行。

答案 5 :(得分:0)

这是一个很难回答的大问题。它的调用归结为你是否愿意在另一个用户正在使用它时阻止一个用户,以及如何防止死锁和糟糕的性能发生。另外,您是在尝试阻止一个用户更新同一行,还是只更新同一个表中的另一行?如果用户A更新了该行,然后用户B尝试更新该行,它是否会失败,更新或默默忽略它?一旦定义了更多问题,就可以决定是否需要表级锁,行级锁,事务以及是否需要各种级别的事务隔离。