PHP PDO事务回滚不起作用
一切都好吗 有谁能帮我吗 我正在尝试使用PHP PDO事务,但我遇到了一个无法解决的问题。 回滚函数在捕获异常时不起作用 这是连接码PHP PDO事务回滚不起作用,php,pdo,transactions,rollback,Php,Pdo,Transactions,Rollback,一切都好吗 有谁能帮我吗 我正在尝试使用PHP PDO事务,但我遇到了一个无法解决的问题。 回滚函数在捕获异常时不起作用 这是连接码 $host = 'localhost'; $user = 'root'; $pass = ''; $error = ''; $dbname = 'tameras_finance'; // Set DSN $dsn = 'mysql:host=' . $host . '; dbname=' . $dbname; // Set options $opti
$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();
}
这是密码
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是一个大小相同的二维数组
请帮助我解释为什么这段代码不回滚MySQL的默认表类型MyISAM不支持事务。您需要确保使用的是InnoDB表
还要检查以确保抛出的异常是PDOxception,否则它将通过try/catch而不会回滚。我认为应该这样做:
$pdo = new \PDO(/*...*/);
$pdo->beginTransaction();
try {
//...
} catch(\Exception $e) {
$pdo->rollBack();
throw $e;
}
$pdo->commit();
它回滚数据库事务,严格来说与PHP无关。也就是说,它不会改变你的变量值。只是一个猜测:尝试在try-catch块之外启动事务……不幸的是,如果我有四行要插入,并且在第三行插入时出现一些异常,那么@Jochen Schultz就不起作用了。它插入前两行并停止,但我猜它应该回滚我正在使用的前两行InnoDB TableBummer:-抛出的异常是什么样子的?只要确保它是作为一个PDOException启动的,而不是其他东西,并且被一些外部的try-catch捕获;调用var_dump$e;检查异常对象的类名。我试图调用var_dump$e,但正如您所说的@Kevin Nagurski,但它没有捕获任何异常,我不知道为什么它看起来不是被抛出的异常。将catch PDOException$e{更改为catch Exception$e{,并将var_转储放在适当的位置。因为catch语句非常具体,如果它不是PDOException,它将跳转到下一个catch。没有捕获任何异常,也不会回滚