2017-01-11 2 views
0

У меня есть код, который использует фиксацию и откатСуществует уже активная транзакция

$pdo = new dbpdo(); 
    $fields = ['id','last','first']; 
    $values = [NULL,'asd','asd']; 
    //$pdo->db->beginTransaction(); 
    try { 
     $pdo->db->beginTransaction(); 
     //echo 'connected'; 
     //$pdo->InsertBatch('staff',implode(',',$data)); 
     //$pdo->InsertBatch('staff',implode(',',$fields), implode(',',$values)); 
     $pdo->InsertBatch('staff',$fields, $values); 
     //$pdo->exec("INSERT INTO staff('id','first','last') VALUES ('NULL','asd','asd')"); 
     //$pdo->execute(); 
     $pdo->commit(); 
     //$message = 'success'; 
     echo 'Save'; 
    } catch (Exception $e) { 
     //die("Unable to connect: " . $e->getMessage()); 
     $pdo->rollBack(); 
     //$message = 'sayop'; 
     //die("Unable to connect: " . $e->getMessage()); 
     echo "Failed: " . $e->getMessage(); 
    } 

мой вопрос. когда я выполняю это. , говорит. Уже есть активная транзакция, и данные не сохраняются в базе данных. , Класс dbpdo расширяет класс PDO.

+1

Похоже, метод $ pdo-> InsertBatch' пытается создать новую транзакцию –

ответ

0

Сегодня у меня такой же сценарий ... Я пытался вставить некоторые записи мастер-детали в Firebird и получить . Есть уже активная транзакция.

Мое решение было включить и отключить опцию автоматической фиксации, попробуйте следующее:

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0)

перед вызовом $pdo->db->beginTransaction()

И когда вы завершить сделку, повторно включить AutoCommit:

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1)

Код: http://php.net/manual/pt_BR/pdo.begintransaction.php#113602

Смежные вопросы