Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个数据库用户同时更新_Php_Mysql_Sql_Database_Mysqli - Fatal编程技术网

Php 多个数据库用户同时更新

Php 多个数据库用户同时更新,php,mysql,sql,database,mysqli,Php,Mysql,Sql,Database,Mysqli,我很好奇我应该采取什么样的途径来实现以下目标。我希望一个位置的多台计算机能够通过web浏览器查看和更改mysql数据库中的数据。我在这方面没有广博的知识,但据我所知,这是非常困难的,如果不是不可能的话 例如:假设我有一张约翰的记录,我希望两台计算机能够编辑约翰的记录。请注意,计算机将不会编辑Johns记录的相同部分。假设一条记录正在将状态从需要调用更改为已调用,而另一台计算机正在将需要订购状态更改为已订购 我想要一个解决方案,可以本机处理这个问题 我目前的知识是用PHP和SQL构建web界面。我

我很好奇我应该采取什么样的途径来实现以下目标。我希望一个位置的多台计算机能够通过web浏览器查看和更改mysql数据库中的数据。我在这方面没有广博的知识,但据我所知,这是非常困难的,如果不是不可能的话

例如:假设我有一张约翰的记录,我希望两台计算机能够编辑约翰的记录。请注意,计算机将不会编辑Johns记录的相同部分。假设一条记录正在将状态从需要调用更改为已调用,而另一台计算机正在将需要订购状态更改为已订购

我想要一个解决方案,可以本机处理这个问题

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

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

。实际上不支持在完全相同的时间更新一条记录,但在紧接着应用一个事务之后再应用另一个事务肯定是受支持的。这是MySQL的原生版本

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
。实际上不支持在完全相同的时间更新一条记录,但在紧接着应用一个事务之后再应用另一个事务肯定是受支持的。这是MySQL的原生版本

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

有几种方法可以实现这一点。已经有一些很棒的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'

这样,如果其他人在您处理姓氏字段时更新了该字段,则您的查询将失败,您将不得不重新输入数据,从而伪造交易。有几种方法可以实现这一点。已经有一些很棒的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'

这样,如果其他人在您处理姓氏字段时更新了该字段,您的查询将失败,您将不得不重新输入数据,从而伪造交易。另一件事是使用旧的桌面方法。Wich几乎是手动控制修改的流程。我将展示:

假设您有一个
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
,并提交它

魔法来了:

创建一个
触发器(更新前)
,该触发器将检查该注册表的当前版本与用户先前选择的版本,类似这样的内容(这只是伪代码,因为我是从头开始执行的):

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

因此,对于给定的示例,它将如下所示:

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

2-同时,用户B选择行1并在用户A之前保存它

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

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


这种方法的问题是,您必须对模型中的每个表或至少您关心的表使用更新前触发器。

另一件要做的事情是旧的桌面方法。Wich几乎是手动控制修改的流程。我将展示:

假设您有一个
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
,并提交它

魔法来了:

创建一个
触发器(更新前)
,该触发器将检查该注册表的当前版本与用户先前选择的版本,类似这样的内容(这只是伪代码,因为我是从头开始执行的):

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

所以在给定的考试中