没有活动的交易

时间:2015-10-14 09:56:25

标签: php mysql pdo transactions

我尝试使用PDO进行交易,使用以下代码

Date

但我收到以下错误(表格未更新):

try
{
    $bdd = new PDO('mysql:host=HOSTNAME;dbname=DATABASENAME', 'USERNAME', 'PASSWORD');
}
catch(Exception $e)
{
    die('Error : '.$e->getMessage());
}    

$qry = 'UPDATE table SET field = CASE';
foreach($elements as $el){
  $qry .= ' WHEN id = '. $el['id'] .' THEN '. $el['value'];
}
$qry .= ' ELSE field END, SET update_date = CASE';
foreach($elements as $el){
  $qry .= ' WHEN id = '. $el['id'] .' THEN NOW()';
}
$qry .= ' ELSE update_date END';

$update = $bdd->prepare($qry);

$bdd->beginTransaction();
try {
    $update->execute();  
    $bdd->commit();
}
catch(Exception $e) {
    $bdd->rollback();
    echo 'Error : '.$e->getMessage().'<br />';
    echo 'N° : '.$e->getCode();
    exit();
}

(106行是Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction' in script.php:106 Stack trace: #0 script.php(106): PDO->rollBack() #1 {main} thrown in script.php on line 106

据我所知,它告诉我没有交易,但......应该有,$bdd->rollback(); ......

感谢您提供任何帮助!

编辑:数据库引擎是MyISAM。

进一步测试后我还有其他信息:

我在问题中简化了$bdd->rollback();,因为我认为这是无关紧要的,但似乎并非如此。我实际使用的查询是一个更长的查询,使用以下代码更新多个元素(我还修改了原始问题中的代码^):

$qry

查询的长度和/或更新行的数量似乎导致了我的问题:

  • 最多更新72行时(查询长度为3463个字符,包含所有空格),表格会更新,$qry = 'UPDATE table SET field = CASE'; foreach($elements as $el){ $qry .= ' WHEN id = '. $el['id'] .' THEN '. $el['value']; } $qry .= ' ELSE field END, SET update_date = CASE'; foreach($elements as $el){ $qry .= ' WHEN id = '. $el['id'] .' THEN NOW()'; } $qry .= ' ELSE update_date END'; 会返回vardump($bdd->beginTransaction();)(无论之前是否为{}}在bool(true)行之后。
  • 更新73行或更多(查询长度为3509个字符,包含所有空格,更新73行时),表格未更新,$update = $bdd->prepare($qry)返回vardump($bdd->beginTransaction();)(再次,无论它是bool(false)行之前还是之后。

对于为什么以及我如何解决它的提示表示赞赏。

再次感谢

编辑2 :我将引擎切换到InnoDB。问题仍然存在。

1 个答案:

答案 0 :(得分:1)

移动

$bdd->beginTransaction();

以上查询:

$qry = 'UPDATE table SET field = value'
$update = $bdd->prepare($qry);

编辑:

您正在使用不支持交易的MyISAM引擎。更新表以使用InnoDB。