【问题标题】:Dependent insertion of data into MySql table将数据依赖插入到MySql表中
【发布时间】:2010-12-01 15:20:09
【问题描述】:

我有 2 张桌子:

user_tb.username user_tb.point

review_tb.username review_tb.review

我正在使用 PHP(CodeIgniter) 进行编码。因此,我尝试将数据与用户提交的评论一起插入到 review_tb 中,如果成功,我将奖励用户一些积分。

这看起来是一个非常简单的过程。我们将首先使用用户名将评论插入到 review_tb 中,并使用 PHP 检查执行的查询是否有任何问题,如果成功,我们将继续更新 user_tb 中的点。

是的,但问题来了。如果插入到 review_tb 是成功的,但是第二个查询,插入到 user_tb 中没有成功,我们可以“撤消” review_tb 查询或“恢复”我们对 review_tb 所做的更改吗?

这有点像“全有或全无”。

这样做的目的是同步数据库中的所有数据,在现实生活中,我们将管理一个包含更多表的数据库,并将更多数据插入到彼此依赖的每个表中。

请对我们如何在 PHP 或 CodeIgniter 或仅 MySql 查询中执行此操作提供一些启示。

【问题讨论】:

    标签: php sql mysql codeigniter


    【解决方案1】:

    如果您想要 SQL 操作的“全有或全无”行为,您正在寻找 transactions ;这是 MySQL 手册中的相关页面:12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax

    维基百科是这样描述的:

    一个数据库事务包括一个 在一个范围内执行的工作单元 数据库管理系统(或 类似系统) 针对数据库, 并以连贯可靠的方式处理 方式独立于其他交易。 数据库环境中的事务 有两个主要目的:

    1. 提供可靠的工作单元,允许正确恢复 失败并保留数据库 即使在系统的情况下也是一致的 失败,当执行停止时 (完全或部分)和许多 对数据库的操作仍然存在 未完成,状态不明。
    2. 在访问数据库的程序之间提供隔离 同时。在没有隔离的情况下 程序的结果通常是 错误。


    基本上:

    • 您开始交易
    • 你做你必须做的;即,您的第一个插入和更新
    • 如果一切正常,则提交事务
    • 否则,如果您的任何查询有任何问题,则回滚事务;它会取消您在该交易中所做的一切。

    有一个关于transactions and CodeIgniter here的手册页。


    请注意,对于 MySQL,并非每个引擎都支持事务;在两个最常用的引擎之间,MyISAM 不支持事务,而 InnoDB 支持它们。

    【讨论】:

      【解决方案2】:

      你不能使用交易吗?如果你在同一个事务中进行了两次插入,那么要么都成功,要么都不成功。

      试试类似的东西

      BEGIN;
      INSERT INTO review_tb(username, review) VALUES(x, y);
      INSERT INTO user_tb(username, point) VALUES(x, y);
      COMMIT;
      

      请注意,您需要使用支持事务的数据库引擎(例如 InnoDB)。

      【讨论】:

        【解决方案3】:

        如果您有 InnoDB 支持,请使用它,但如果无法使用,您可以使用类似于以下的代码:

         $result=mysql_query("INSERT INTO ...");
         if(!$result) return false;
        
         $result=mysql_query("INSERT INTO somewhereelse");
         if(!$result) {
              mysql_query("DELETE FROM ...");
              return false;
         }
        
         return true;
        

        此清理可能仍会失败,但只要插入查询由于重复或约束而失败,它就可以工作。对于意外终止,唯一的方法是使用事务。

        【讨论】:

        • 是的,我实际上在考虑这个解决方案,但意识到“这个清理可能仍然失败............意外终止”
        猜你喜欢
        • 1970-01-01
        • 2022-10-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 2013-02-20
        • 2015-01-09
        相关资源
        最近更新 更多