Php 复杂的困惑

Php 复杂的困惑,php,mysql,Php,Mysql,如何从多个位置更新单个单元格 $query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'"; 我将使用以下命令更新该行。这需要从多台计算机同时更新 你能告诉我怎么解决吗 机器1发送 $query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'"; 机器2发送 $query = "UPDATE users SET data

如何从多个位置更新单个单元格

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
我将使用以下命令更新该行。这需要从多台计算机同时更新

你能告诉我怎么解决吗

机器1发送

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
机器2发送

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
机器3发送

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
机器4发送

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
机器5发送

$query = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";
在某些情况下,这样做可能会导致数据丢失

如果我们获取数据并进行更新,它会解决问题吗?比如说

取回

$query1=“从Username=pool\u数据中选择用户”

更新

$query2=“更新用户集数据='$final\u data'其中Username='pool\u data'”

取回

$query1=“从Username=pool\u数据中选择用户”

更新

$query2=“更新用户集数据='$final\u data'其中Username='pool\u data'”

取回

$query1=“从Username=pool\u数据中选择用户”

更新

$query2=“更新用户集数据='$final\u data'其中Username='pool\u data'”

每次发布数据时,我们都会获取并更新数据。这是否有任何可能的问题?

MySQL是一个DBMS(数据库管理系统)。因此,MySQL为您提供了管理数据库的工具和方法

官方网站()包含设置MySQL、创建数据库和更新表所需的所有信息


如果您对您的SQL代码或某些MySQL设置有特定问题,只需在此处发布SQL语句或向我们提供更多描述您的问题的信息

我认为您的意思是确保数据库中数据的完整性

例如,这可以通过使用锁定来实现。如果您使用Innodb作为存储引擎,则默认情况下将启用该引擎。它在行级别使用锁定,这意味着当初始连接忙于写入时,其他连接无法写入该行

如果您使用另一个引擎,您可能希望使用事务。您需要考虑使用哪种类型的并发,悲观还是乐观。OPTIMIZE跟踪行的版本,以确保其中数据的完整性


有关在mysql中使用事务的更多说明:

我不确定是否理解了您的问题,因此我将尝试重新表述。我想你是在问:

在多个客户端正在更新数据库的场景中,如何 您是否确保不同的客户端不会覆盖彼此的 数据

对此没有共同的答案——这取决于

最简单的解决方案是在每条记录中包含一个版本号,因此您的查询类似于:

FETCH

$query1 = "SELECT users from where Username=pool_data" ;

UPDATE

$query2 = "UPDATE users SET data='$final_data', versionID = '$newVersion' WHERE Username ='pool_data' and versionID = '$versionID'";
这假设您的客户机生成版本号;您也可以通过触发器来完成此操作。这样,如果您的客户端在过去读取了一些数据,而另一个客户端修改了这些数据,那么update语句将影响零行;然后,您可以让应用程序决定如何处理该问题

在这个模型中,第一个客户端“获胜”——第一个更新数据的客户端不必管理冲突数据

更复杂的解决方案删除“更新”语句,而是将数据库转换为事件流或分类账

FETCH

$query1 = "SELECT ..., max(entry_date) from where Username=pool_data group by ..." ;

UPDATE

$query2 = "insert into users values (@userName, '$final_data', $now());

当最后一个客户机应该获胜时,或者当您可以使用其他逻辑来计算应用程序数据的真实状态时,这种方法很有效。

当然,如果您反复更新同一行(用户名具有相同的值),您将覆盖数据。理解MySQL管理您的sql查询是很重要的。它将在最后一个事务完成后启动一个查询。这意味着,即使从不同的计算机启动所有查询,也不会同时处理它们。MySQL为您管理并行性。显然,如果您更新相同用户名的相同数据,您将再次覆盖上次的更改,但这将是一个表概念问题。