多个DB用户同时更新

时间:2014-07-07 18:10:48

标签: php mysql sql database mysqli

我很好奇我应该采取什么样的方法来完成以下任务。我希望一个位置的多台计算机能够使用Web浏览器查看和更改mysql数据库内的数据。我在这方面没有广泛的知识,但从我的记忆中,这是非常困难的,如果不是不可能的话。

示例:假设我有John的记录,我希望2台计算机能够编辑Johns记录。请注意,计算机不会编辑Johns记录的相同部分。让我们说一条记录正在改变一个状态,从需要调用到被调用,而另一台计算机正在改变需要订购的状态。

我想要一个原生可以解决这个问题的解决方案。

我目前的知识是使用PHP和SQL构建Web界面。我想使用这些语言,因为我有一些先验知识。

所以我的问题:这可能吗?如果,那究竟是如何工作的(信息流)?

3 个答案:

答案 0 :(得分:2)

Use Transactions。在同一时间更新单个记录并不是真的支持,但是应用一个事务后立即执行另一个事务肯定是。这是MySQL的原生。

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

答案 1 :(得分:2)

有几种方法可以实现这一目标。已经有一些很棒的PHP数据库编辑软件包(phpMyAdmin)。

要在代码中处理此问题,尽管您可以使用事务处理(取决于您使用此字符的SQL风格会以不同方式执行)

确保您不会让人们的数据相互冲突的一种更简单的方法就是在您的陈述中添加其他where子句。

假设您有一个用户记录,并且您想要将姓氏从Smith更新为Bill,并且用户ID为4.

而不是写

   UPDATE users SET lastName='Bill' WHERE id='4'

你会加入:

   UPDATE users SET lastName='Bill' WHERE id='4' AND lastName='Smith'

这样,如果其他人更新姓氏字段,您的查询将失败,您将不得不重新输入数据,从而伪造交易

答案 2 :(得分:2)

另一件事是旧的桌面方法。这几乎是mannualy控制修改的流程。我会说:

假设您有client表格,其中包含字段id, firstname, lastname, age。为了控制多个用户更新,您需要将version integer default 0字段添加到此表中。

当您将表单上的对象填充给用户时,您还将存储用户选择的实际版本。

因此,假设您的客户端表格如下:

id   firstname   lastname   age   version
 1     Tomas       Luv       20      0
 2     Lucas       Duh       22      0
 3     Christian   Bah       30      0

当用户选择id=1的客户端时,此行的版本在此时为0。然后,用户将此客户的姓氏更新为Bob并提交。

魔术来了:

创建一个trigger (before update),它将使用用户之前选择的版本检查该注册表的当前版本,如下所示(这只是伪代码,因为我从头开始):< / p>

create trigger check_client_version on client before update as

  begin
      if new.version != old.version then
          throw some error saying that a modification already was done;
      else
         new.version = old.version + 1;
      end if;
  end;

在应用程序上,您检查更新是否有此错误,并通知用户其他人对他尝试更改的注册表进行了更改。

因此,在给定的示例中,它将是:

1 - 用户A选择了第1行并开始编辑

2 - 同时用户B选择第1行并将其保存在用户A

之前

3 - 用户A尝试保存修改并从应用程序中获取错误

在此上下文中,用户A具有指向0的版本字段也是用户B但是当用户B保存注册表时它现在是1并且当用户A尝试保存它时它将因检查触发器而失败

这个approch的问题在于,您必须为模型中的每个表或至少与您关注的表有一个更新前触发器。