KO3,PostgreSQL,Transactions和PDOException

时间:2010-09-17 17:40:18

标签: exception postgresql transactions kohana-3

我遇到了一个我希望得到一点帮助的问题。我正在使用以下内容:

Kohana 3.0.7
PostgreSQL 8.4
PostgreSQL中的事务使用

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

问题是,当我向数据库发送查询导致事务中的postgres错误时,我的系统会冻结。当我将相同的查询发送到数据库而不将其包装在事务中时,PDO错误将按预期报告回来。这是一个例子:

第一个示例工作正常,重复键值违反唯一约束“pk_test_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";
}           

第二个例子导致我的系统冻结(我无法判断它是无限循环,还是其他一些冻结):

$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);

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

有关正在发生的事情的任何想法?有什么建议可以尝试吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。不确定这是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_exists,我可以在没有异常的情况下执行该操作。如果有异常,我尝试ROLLBACK或COMMIT然后我得到冻结行为。

这暂时有效,但我不会称之为优雅。