【发布时间】:2017-05-14 13:30:16
【问题描述】:
我遇到了 php 脚本中的事务问题。如果至少其中一个失败,我想进行多次查询并能够全部召回它们。您可以在下面找到我正在使用的脚本的一个简单示例:
$tags_input = array(6,4,5);
$conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8',
DB_USER, DB_PASSW, array(
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
$conn->beginTransaction();
$sql = "INSERT INTO projects (id, pr_id, enabled) VALUES ( :val0, :val1, :val2)";
$stmt = $conn->prepare($sql);
if(count($tags_input)>0){
for($i = 0;$i<count($tags_input);$i++){
$stmt->bindValue(':val0', 57);
$stmt->bindValue(':val1', $tags_input[$i]);
$stmt->bindValue(':val2', 'Y');
$result = $stmt->execute();
}
}
$res1 = $conn->commit();
$conn->rollBack();
现在,这个例子产生了一个错误:
未捕获的异常“PDOException”和消息“没有活动 交易”
如果我删除$conn->rollBack(); 行,错误就会消失。因此我无法理解,为什么pdo 对象看不到打开的事务(begintransaction 和commit 不会产生任何错误)。我还尝试将rollBack() 放入事务中,但没有任何区别。我仍然收到错误消息“没有活动交易”。
我在 InnoDB 上运行 PHP 5.6 和 Mysql 表。
【问题讨论】:
-
你在这里提交事务:`$res1 = $conn->commit();` 所以你不能回滚
-
尝试将您的事务代码包装到 try-catch 语句中,如php.net/manual/en/pdo.transactions.php 中的第一个示例所示
-
@e4c5 感谢您的意见。这是否意味着一旦您提交事务就不能回滚?在那种情况下,我不确定我是否在回滚中看到了感觉,就好像我遇到了一个错误,我只是不提交事务..
标签: php mysql pdo transactions