MySQL事务提供错误

时间:2017-07-18 12:23:19

标签: php mysql transactions innodb

现在已经坚持了几个小时,我是服务器开发的新手,所以请对我很轻松。

当我尝试运行下面的代码时,我收到以下SQL错误:

  

错误:

SET AUTOCOMMIT=0;
START TRANSACTION;
BEGIN;
INSERT
     INTO  orders (firstname, lastname, spots, order_id)
    VALUES  ('NAME', 'NAME', 5, '20170718-FC5E8');
INSERT
     INTO  orders_info (order_id, ip, user_agent)
    VALUES  ('20170718-FC5E8', '', 'browser');
COMMIT;
  

您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以便在第1行'START TRANSACTION; BEGIN; INSERT INTO orders (firstname, lastname, spots, order_'附近使用正确的语法

我想要做的是将数据插入两个不同的表中,我遇到了很大的麻烦。我正在尝试将数据插入到订单和orders_info中,为此我正在使用此查询代码:

 $sql = "SET AUTOCOMMIT=0; START TRANSACTION; BEGIN; INSERT INTO orders (firstname, lastname, spots, order_id)
        VALUES ('$firstname_value', '$lastname_value', $spots_value, '$unique'); INSERT INTO orders_info (order_id, ip, user_agent)
        VALUES ('$unique', '$ip', 'browser'); COMMIT;";

        if ($conn->query($sql) === TRUE) {
            echo "Your order has been placed!" ."<br><br>". "Firstname: {$firstname_value}" ."<br>". "Lastname: {$lastname_value}" ."<br>". "Spots: {$spots_value}";
            echo "<br><br>" . "ORDER #: {$unique}";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }

        $conn->close();

3 个答案:

答案 0 :(得分:0)

您不需要使用SET AUTOCOMMIT=0禁用自动提交它会在您使用START TRANSACTION;时自动禁用,并在使用COMMIT;时恢复到原始状态在您的sql命令中它看起来像BEGIN;一样引起了一个问题。

所以将所有sql语句放在start transaction和commit之间。

START TRANSACTION;
//your SQL statements
COMMIT;

答案 1 :(得分:0)

  • 只需一次调用API,就不会有多个语句。
  • 然后在每个SQL之后检查错误。
  • START TRANSACTIONBEGIN是同义词;不要做这两件事。
  • START/BEGIN会覆盖autocommit;不要担心autocommit

答案 2 :(得分:0)

在MySQL中,支持'BEGIN'和'BEGIN WORK'作为'START TRANSACTION'的别名。但是'START TRANSACTION'允许BEGIN没有的修饰符。

如果AUTOCOMMIT设置为1(默认值),则每个SQL语句(在事务内或不在事务中)都被视为完整事务,并在完成时默认提交。当AUTOCOMMIT设置为0时,通过发出SET AUTOCOMMIT = 0命令,后续的一系列语句就像一个事务,并且在发出显式COMMIT语句之前不会提交任何活动。

默认情况下,MySQL在启用AUTOCOMMIT的情况下运行。

使用START TRANSACTION隐式禁用自动提交。并且自动提交将被禁用,直到我们COMMIT或ROLLBACK。然后AUTOCOMMIT模式恢复到之前的状态。