PDO :: ATTR_AUTOCOMMIT忽略非事务性INSERT/UPDATE

Aid*_*ell 9 php pdo

一直在摸我的头......

我有一个PDO对象,pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);因为我想使用FOR UPDATE一些InnoDB表.阅读MySQL文档,FOR UPDATE只会在以下情况下锁定读取行:

  1. 您正在进行交易
  2. 不在交易中并且set autocommit=0已经签发

所以,我ATTR_AUTOCOMMIT用来允许PDO对象锁定行.在任何一种情况下,这都会导致INSERT和UPDATE语句不适用.这些语句与FOR 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
Run Code Online (Sandbox Code Playgroud)

PHP/PDO没有抱怨,但从表中选择显示数据尚未写入.

我正在运行的查询已经运行了数千次; 只有ATTR_AUTOCOMMIT改变了.删除该选项会使一切都恢复正常.交易也可以选择正常运行autocommit=0.

是否需要对PDO对象进行额外调用(commit()正确地抱怨它不在事务中)才能使更改成为可能?基本上,我想要一个普通的PDO对象,但是可以选择锁定InnoDB表的事务之外的行(背景为什么这里太长而且很无聊).

我确定这是一个愚蠢的东西我缺少划痕头

Wri*_*ken 7

    $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
Run Code Online (Sandbox Code Playgroud)

但实际上,你处于一个事务中(你还没有用PDO启动它),回滚等也仍然可用.这是否是一个错误(无法commit()直接调用)是值得商榷的.