一直在摸我的头......
我有一个PDO对象,pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);因为我想使用FOR UPDATE一些InnoDB表.阅读MySQL文档,FOR UPDATE只会在以下情况下锁定读取行:
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表的事务之外的行(背景为什么这里太长而且很无聊).
我确定这是一个愚蠢的东西我缺少划痕头
$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()直接调用)是值得商榷的.
| 归档时间: |
|
| 查看次数: |
6673 次 |
| 最近记录: |