MySQL复杂的混乱

时间:2017-03-28 08:10:30

标签: 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='$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'";

这样做可能会在某些情况下导致数据丢失。

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

FETCH

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

更新

$query2 = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";

FETCH

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

更新

$query2 = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";

FETCH

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

更新

$query2 = "UPDATE users SET data='$final_data' WHERE Username ='pool_data'";

我们每次发布数据时都会获取并更新数据。这有什么问题吗?

3 个答案:

答案 0 :(得分:0)

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

官方网站(https://www.mysql.com/)包含设置MySQL,创建数据库以及所有相应更新表信息所需的所有信息。

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

答案 1 :(得分:0)

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

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

如果您使用其他引擎,则可能需要使用交易。您需要考虑要使用哪种类型的并发,无论是悲观还是乐观。乐观是跟踪行的版本以确保其中数据的完整性。

有关在mysql中使用事务的更多说明:https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-transactions.html

答案 2 :(得分:0)

我不确定我是否理解了你的问题,所以我会尝试改写它。我想你在问:

  

在多个客户端正在更新数据库的情况下,如何   你确保不同的客户不会互相覆盖   数据?

对此没有共同的答案 - 一切都取决于......

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

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());

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