如何确保在 MySQL 上同时对 2 个表进行相等更新

How to assure equal update on 2 tables simultaneously on MySQL

我有一个我无法解决的问题。我试图用相同的数据更新 2 个不同的表,但我总是以差异结束

我有 2 个表:usersstats

users结构:

id: int(25)
balance: decimal(18,6)

stats结构:

date: date
userid: int(25)
balance: decimal(18,6)

我正在使用 innodb 事务来更新表,如下所示:

    mysql_query("BEGIN TRANSACTION");

    $result1 = mysql_query("INSERT INTO users(id, balance)
        VALUES ".$balance." 
        ON DUPLICATE KEY UPDATE balance = balance + VALUES(balance)");


    $result2 = mysql_query("INSERT INTO pubday (date, userid, balance) 
        VALUES ".$balance."
        ON DUPLICATE KEY UPDATE balance=balence+VALUES(balance)");



if($result1 === false || $result2 === false) {
mysql_query("ROLLBACK");
}else{
mysql_query("COMMIT");
}

我每天至少更新表格 500 万次。不管怎样,我总是从 usersstats 的余额中得到一个微小的差异,这个查询:

SELECT sum(balance) from stats

SELECT balance from users

例如,我在统计数据上得到 balance=302.001731,在用户上得到 balance=302.194501。应该是一样的。

我的问题是这里的错误是什么或者我做错了什么?或者解决这个问题的最佳方法是什么?用相同的数据同时更新 2 个表。

答案很简单:不要拥有多个权限点。如果两列应该相同,使它们成为同一列。我会这样做是删除 stats.balance,并在需要时通过 SQL.

即时计算统计数据

毕竟,临时查询是 1970 年代最初研究关系数据库管理系统 (RDBMS) 的核心原因之一。

与此同时,您似乎想要某种 "Materialized View" 以便显示过去的数据。如果是这种情况,请考虑暂时保存 each 事务,然后根据 SQL 计算定期插入统计信息 table。类似于:

INSERT INTO stats (date, userid, balance)
  SELECT CURDATE(), id, SUM(balance) FROM users GROUP BY 1, 2;

并且可能,根据您的需要,通过 ON DUPLICATE KEY UPDATE 使用 UPSERT。

显然,SUM(balance) 不完整或不正确,但求和的想法是重点,在您更新架构后。