我遇到了一个我希望得到一点帮助的问题。我正在使用以下内容:
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);
正如您所看到的,唯一的区别是第二个示例包含在事务中。
有关正在发生的事情的任何想法?有什么建议可以尝试吗?
答案 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然后我得到冻结行为。
这暂时有效,但我不会称之为优雅。