KO3, PostgreSQL, транзакции и исключение PDOException - PullRequest
0 голосов
/ 17 сентября 2010

Я столкнулся с проблемой, на которую надеюсь получить небольшую помощь.Я использую следующее:

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 голосов
/ 17 сентября 2010

Я нашел способ обойти эту проблему.Не уверен, что это ошибка в 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);
}

Добавив переменную $ exception_exists в улове, я могузатем действовать, если нет исключений.Если есть исключение, и я пытаюсь выполнить команду ROLLBACK или COMMIT, я получаю поведение замораживания.

Пока это работает, но я бы не назвал это элегантным.

...