2014-01-22 2 views
2

У вас возникли проблемы с правильным использованием mysqli autocommit. Ниже приведены запросы.Правильное использование autocommit php mysqli и отката

Таблица1 и Таблица3 являются ЬшоВВ в то время как Table2 является MyISAM

Значения к Table2 и Table3 вставлены надлежащим образом, но значения к Table1 не хранятся. Ошибок при запуске кода не возникает.

$dbconnect->autocommit(false); 

$stmt = $dbconnect->prepare("INSERT INTO `table1`(`col1`,`col2`) VALUES (?,?)"); 
$stmt->bind_param('ss',$val1,$val2); 
$stmt->execute(); 
$dbconnect->rollback(); 

$stmt = $dbconnect->prepare("INSERT INTO `table2`(`col1`,`col2`) VALUES (?,?)"); 
$stmt->bind_param('ss',$val3,$val4); 
$stmt->execute(); 
$dbconnect->rollback(); 

$stmt = $dbconnect->prepare("INSERT INTO `table3`(`col1`,`col2`) VALUES (?,?)"); 
$stmt->bind_param('ss',$val5,$val6); 
$stmt->execute(); 

$dbconnect->commit(); 

Когда и как вы используете autocommit (false) и rollback()?

ответ

7

Вы используете его, когда у вас есть ряд операторов sql, которые должны выполняться вместе, чтобы поддерживать согласованность в вашей базе данных. Подумайте о том, чтобы называть фиксацию как создание точки сохранения в игре. Каждый раз, когда вы вызываете откат, вы отменяете все, что было сделано до предыдущего фиксации.

Представьте ситуацию, когда вам нужно сохранить счет в таблице счетов, подробную информацию в таблице invoice_details и платежах в таблице платежей. Чтобы поддерживать согласованность, вам нужно убедиться, что все это сделано или ни одно из них не выполняется. Если вы хотите добавить счет-фактуру и детали, а затем произошел сбой при вставке платежа, то ваша база данных останется в противоречивом состоянии.

Обычно это достигается с помощью попытаться/поймать блок, как это:

try { 
    $dbconnect->autocommit(false); 

    $stmt = $dbconnect->prepare("INSERT INTO `invoices`(`col1`,`col2`) VALUES (?,?)"); 
    $stmt->bind_param('ss',$val1,$val2); 
    $stmt->execute(); 

    $stmt = $dbconnect->prepare("INSERT INTO `invoice_details`(`col1`,`col2`) VALUES (?,?)"); 
    $stmt->bind_param('ss',$val3,$val4); 
    $stmt->execute(); 

    $stmt = $dbconnect->prepare("INSERT INTO `payments`(`col1`,`col2`) VALUES (?,?)"); 
    $stmt->bind_param('ss',$val5,$val6); 
    $stmt->execute(); 

    $dbconnect->commit(); 
} catch(Exception $e){ 
    // undo everything that was done in the try block in the case of a failure. 
    $dbconnect->rollback(); 

    // throw another exception to inform the caller that the insert group failed. 
    throw new StorageException("I couldn't save the invoice"); 
} 
+1

теперь я получаю его. поэтому «commit» завершает и «откатывает» для отката транзакций. как насчет параметра autocommit 'true' и' false'? В руководстве написано: «Включить авто-фиксацию или нет», поэтому, установив false, я отключил его? –

+1

Это правильно. Вероятно, лучшее решение - оставить его включенным и выключить, если вам нужно. Также имеет смысл использовать [транзакцию] (http://www.php.net/manual/en/mysqli.begin-transaction.php), поэтому вам не нужно задаваться вопросом о значении авто- фиксация. – Orangepill

+0

Поскольку я прочитал его в документации PHP в качестве комментария, включите и выключите автозапуск, также совершает все, что еще не было выполнено. Так что я могу просто включить его снова вместо фиксации? '$ dbconnect-> autocommit (true)' в конце 'try' – Lithilion

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