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.7PostgreSQL 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()中