2010-09-17 15 views
0

J'ai rencontré un problème sur lequel j'espère avoir un peu d'aide. J'utilise les éléments suivants:KO3, PostgresSQL, Transactions et PDOException

Kohana 3.0.7
PostgreSQL 8.4
transactions dans PostgreSQL en utilisant

$db->query(NULL, 'BEGIN', FALSE) 
$db->query(NULL, 'ROLLBACK', FALSE); 
$db->query(NULL, 'COMMIT', FALSE); 

Le problème est que lorsque j'envoie une requête à la base de données qui se traduit par une erreur de postgres Dans une transaction, mon système se fige. Lorsque j'envoie la même requête à la base de données sans l'encapsuler dans une transaction, l'erreur PDO est renvoyée comme prévu. Voici un exmaple:

Ce premier exemple fonctionne très bien et en double valeur de clé est contraire contrainte unique erreur « pk_test_table » est retourné:

$query = DB::query(Database::INSERT, 'INSERT INTO test_table (test_table_id, test_table_val) VALUES (:id, :value)'; 
$query->param(':id', 1); 
$query->param(':value', "test value"); 

try 
{ 
    $result = $query->execute($db); 
} 
catch (Exception $e) 
{ 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
}   

Ce second exemple provoque mon système de geler (je ne peux pas dire si il est une boucle infinie, ou un autre gel):

$db->query(NULL, 'BEGIN', FALSE); 

$query = DB::query(Database::INSERT, 'INSERT INTO test_table (test_table_id, test_table_val) VALUES (:id, :value)'; 
$query->param(':id', 1); 
$query->param(':value', "test value"); 

try 
{ 
    $result = $query->execute($db); 
} 
catch (Exception $e) 
{ 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
}   

$db->query(NULL, 'ROLLBACK', FALSE); 

Comme vous pouvez le voir, la seule différence est que le second exemple est enveloppé dans une transaction.

Des idées sur ce qui se passe? Des suggestions pour les choses à essayer?

Répondre

0

J'ai trouvé un moyen de contourner le problème. Je ne sais pas si cela est un bogue dans AOP ou une autre partie de l'ensemble d'outils, mais ce que je fais travailler est autour des axes suivants:

$exception_exists = FALSE; 

$db->query(NULL, 'BEGIN', FALSE); 

$query = DB::query(Database::INSERT, 'INSERT INTO test_table (test_table_id, test_table_val) VALUES (:id, :value)'; 
$query->param(':id', 1); 
$query->param(':value', "test value"); 

try 
{ 
    $result = $query->execute($db); 
} 
catch (Exception $e) 
{ 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
    $exception_exists = TRUE; 
}   

if (!$exception_exists) 
{ 
    $db->query(NULL, 'ROLLBACK', FALSE); 
} 

En ajoutant la variable exception_exists de $ dans les prises, je peux alors agir de cela s'il n'y a pas d'exception. S'il y a une exception et que j'essaie de ROLLBACK ou COMMIT, j'obtiens le comportement de gel.

Cela fonctionne pour l'instant mais je ne l'appellerais pas élégant.

+0

add -> requête (NULL, 'COMMIT', FALSE) dans la section try, et -> query (NULL, 'ROLLBACK', FALSE) pour catch() – biakaveron