Php 无活动事务

Php 无活动事务,php,mysql,pdo,transactions,Php,Mysql,Pdo,Transactions,我尝试使用PDO的事务,代码如下 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){

我尝试使用PDO的事务,代码如下

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行是
$bdd->rollback();

我知道它告诉我没有交易,但是。。。应该有,使用
$bdd->rollback()

谢谢你能给我的帮助


编辑:数据库引擎是MyISAM

进一步测试后,我有更多信息:

我简化了问题中的
$qry
,因为我认为它无关紧要,但似乎不是。我实际使用的查询要长得多,使用以下代码更新多个元素(我还修改了原始问题中的代码^):

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

  • 当更新最多72行时(查询长度为3463个字符,包括所有空格),表将被更新,并且
    vardump($bdd->beginTransaction();)
    返回
    bool(true)
    (无论是在
    $update=$bdd->prepare($qry)
    行之前还是之后)
  • 更新73行或更多行时(查询长度为3509个字符,更新73行时包含所有空格),表不会更新,
    vardump($bdd->beginTransaction();)
    返回
    bool(false)
    (再次,无论是在
    $update=$bdd->prepare($qry)
    行之前还是之后
我很感激你能给我一些提示,告诉我为什么,以及如何修复它

再次感谢


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

移动

$bdd->beginTransaction();
要查看您的查询,请执行以下操作:

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


您使用的是不支持事务的MyISAM引擎。请更新您的表以使用InnoDB。

您可以更新您的帖子以显示您的PDO连接代码吗?我不确定是否添加了您要求的内容,但它已更新。代码对我有效,您使用的是什么数据库引擎?您应该使用InnoDB,因为它支持事务。Thnaks for数据库引擎是MyISAM,但我认为这不是问题所在:我在
var\u dump($bdd->beginTransaction()时发现了一个案例;
返回
true
。似乎问题可能出在查询的长度上。我编辑了原始问题以添加我发现的内容,您可以再看一看吗?更改为InnoDB。MyISAM不支持事务。查询很好。您的所有代码都在我的InnoDB表测试中工作,它返回
bool(false)
确保PDO将在错误时引发异常:
$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
。我怀疑这不是查询的大小,而是内容。我现在得到一个新错误:
致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误:2006 MySQL服务器在script.php:75堆栈跟踪:#0 script.php(75):PDO->beginTransaction()#1{main}抛出在script.php的第75行
,第75行是
$bdd->beginTransaction();
。我不知道这意味着什么……您是否将生成的SQL保存到一个文件中,然后尝试在
SQL管理器中运行相同的查询,例如
phpmyadmin
?我想知道这是PDO问题还是服务器问题。。一种可能是“查询太大”。-/但它必须非常大。因此,将其存储在一个文件中,以便您可以检查它。您发送要更新的数据的大小是多少?我不知道为什么会有影响。我很难理解您看到的影响。我看不出我可以如何提供进一步的帮助。抱歉。
$bdd->beginTransaction();
$qry = 'UPDATE table SET field = value'
$update = $bdd->prepare($qry);