首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP事务rollBack不工作

PHP事务rollBack不工作
EN

Stack Overflow用户
提问于 2015-05-05 08:43:19
回答 2查看 1.5K关注 0票数 3

一切都好吗

有人能帮我吗?

我正在尝试使用PHP事务,我面临一个问题,我无法处理它。

rollBack函数在捕获异常时不能工作

这是连接代码

代码语言:javascript
复制
$host   = 'localhost';
$user   = 'root';
$pass   = '';
$error  = '';
$dbname = 'tameras_finance';
// Set DSN
$dsn = 'mysql:host=' . $host . '; dbname=' . $dbname;
// Set options
$options = array(
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try {
    $dbh = new PDO($dsn, $user, $pass);
    $dbh->exec("set names utf8");
}
//Catch any errors
catch (PDOException $e) {
    echo $error = $e->getMessage();
}  

在这里,代码

代码语言:javascript
复制
try{
    $dbh->beginTransaction();
    $dbh->query('SET @newDebit = (SELECT max(`debtor_id`) + 1 AS maxDebit FROM `vocher`)');
    for($x = 0; $x < count($debits); $x++){
        $dbh->query('UPDATE `vocher` SET `debtor_id` = @newDebit, `status_id` = "4" WHERE `id` = '.$debits[$x]);
    }

    for($x = 0; $x < count($others); $x++){
        $columns = '`acc_id`, `value`, `date`, `desc`, `reject`, `vo_type_id`, `user`, `debtor_id`';
        $vals  = "'".$accs[$x]."','".$values[$x]."','".$dates[$x]."','".$descs[$x]."','1','1','".$user."', @newDebit";
        if($others[$x] == 'e'){
            $columns .= ', `cheque_no`, `available_date`, `issue_date`, `bank_id`';
            $vals  .= ", '".$sns[$x]."', '".$availdates[$x]."', '".$issueDates[$x]."', '".$banks[$x]."'";
        }
        $dbh->query("INSERT INTO creditor (".$columns.") VALUES (".$vals.")");
        if($lists[$x] != 'e'){
            $lastId = $dbh->lastInsertId();
            $q  = 'INSERT INTO `creditor_cc` (`creditor`, `cc`) VALUES ';
            for($y = 0; $y < count($lists[$x]); $y++){
                $dif = count($lists[$x]) - $y;
                $q .= '(';
                $q .= '"' . $lastId . '",';
                $q .= '"'.$lists[$x][$y].'"';
                $q .= ')';
                if($dif > 1){
                    $q .= ',';
                }
            }
            $dbh->query($q);
        }
    }
    $dbh->commit();
} catch(PDOException $e) {
    echo $error = $e->getMessage();
    $dbh->rollBack();
}

此代码不回滚

请注意:

  • $sns、$others、$accs、$values、$dates、$descs、$availdates、$issueDates和$banks是大小相同的数组
  • 另外,$lists是一个大小相同的二维数组。

请帮我解释一下为什么这段代码不rollBack

EN

回答 2

Stack Overflow用户

发布于 2015-05-05 08:56:35

MySQL的默认表类型MyISAM不支持事务。您需要确保使用的是InnoDB表。

还要检查,以确保抛出的异常是PDOException,否则它会掉进try/catch,而不会回滚。

票数 5
EN

Stack Overflow用户

发布于 2015-05-05 12:21:22

我想说应该这样做:

代码语言:javascript
复制
$pdo = new \PDO(/*...*/);

$pdo->beginTransaction();

try {
//...
} catch(\Exception $e) {
    $pdo->rollBack();
    throw $e;
}

$pdo->commit();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30048101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档