代码之家  ›  专栏  ›  技术社区  ›  Aiden Bell

pdo::attr_autocommit忽略非事务性插入/更新

  •  8
  • Aiden Bell  · 技术社区  · 14 年前

    在这上面抓我的头有一段时间了…

    我有一个PDO对象 pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); 我想用的 FOR UPDATE 有一些innodb表。阅读mysql文档, 更新 只有在以下情况下才会锁定读取行:

    1. 你在交易中
    2. 你是 在交易中 set autocommit=0 已发布

    所以,我用 ATTR_AUTOCOMMIT 允许PDO对象锁定行。在这两种情况下,都会导致INSERT和UPDATE语句不适用。这些说法与 更新 它们只是用准备好的语句运行同一个PDO对象。

    我的MySQL查询日志如下:

    xxx    Connect   user@host
    xxx    Query     set autocommit=0
    xxx    Query     INSERT INTO foo_tbl (bar, baz) VALUES ('hello','world')
    xxx    Quit
    

    php/pdo没有抱怨,但是从表中选择显示数据没有被写入。

    我正在运行的查询已经运行了数千次;只有 自动提交 已进行更改。删除该选项将使所有内容重新工作。交易使用该选项工作正常 autocommit=0 也是。

    是否需要对PDO对象进行其他调用( commit() 正确地抱怨它不在一个事务中)使更改保持不变?基本上,我想要一个普通的PDO对象,但是可以选择为innodb表锁定事务之外的行(这里的背景说明为什么太长和无聊)。

    我肯定这是我错过的愚蠢的东西 划痕头

    1 回复  |  直到 11 年前
        1
  •  7
  •   Wrikken    14 年前
        $db = new PDO('mysql:dbname=test');
        $db->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
        var_dump($db->query('SELECT @@autocommit')->fetchAll()); //OK
        $db->query("INSERT INTO foo (bar) VALUES ('a');");
        $db->query("COMMIT;");//do by SQL rather then by interface / PDO-method
    

    但本质上,您正在处理一个事务(您还没有用PDO启动它),回滚等也仍然可用。这是否是一个bug(不能调用 commit() 直接)。