Exception KO3、PostgreSQL、事务和PDO异常

Exception KO3、PostgreSQL、事务和PDO异常,exception,postgresql,transactions,kohana-3,Exception,Postgresql,Transactions,Kohana 3,我遇到了一个问题,希望能得到一些帮助。我正在使用以下命令: $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->

我遇到了一个问题,希望能得到一些帮助。我正在使用以下命令:

$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);
}
科哈纳3.0.7
PostgreSQL 8.4
在PostgreSQL中使用

$db->query(NULL, 'BEGIN', FALSE)  
$db->query(NULL, 'ROLLBACK', FALSE);  
$db->query(NULL, 'COMMIT', FALSE);   
问题是,当我向数据库发送一个查询,导致事务中出现postgres错误时,我的系统就会冻结。当我将相同的查询发送到数据库而不将其包装到事务中时,PDO错误会按预期报告回来。这是一个exmaple:

第一个示例工作正常,重复的键值违反唯一约束“pk\U test\U table”返回错误:

$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";
}           
第二个示例导致我的系统冻结(我无法判断它是无限循环还是其他冻结):

正如您所看到的,唯一的区别是第二个示例包装在一个事务中


有什么想法吗?有什么建议可以尝试吗

我找到了解决这个问题的方法。不确定这是否是PDO或工具集的其他部分中的错误,但我正在做以下工作:

$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);
}
通过在catch中添加变量$exception_,我可以在没有异常的情况下执行该操作。如果出现异常,并且我尝试回滚或提交,那么我将获得冻结行为

这个现在可以用了,但我不认为它很优雅

将->查询(NULL,'COMMIT',FALSE)添加到try部分,并将->查询(NULL,'ROLLBACK',FALSE)添加到catch()中