2016-02-05 2 views
4

Я использую MyISAM для MySQL, и я хочу использовать транзакцию вот мой код:Сделка с Eloquent Laravel 5

DB::transaction(function() { 
$project = Project::find($id); 
$project->users()->detach(); 
$project->delete(); 
}); 

Этот код выполнить succesfuly, но я не уверен, что сделка работает ... Как я могу Попробуй это?

ответ

11

Есть только 2 способа сделать это, и не особенно приятно, потому что DB: транзакция не сообщает об ошибках.

  1. Поместите блок try/catch внутри замыкания и установите внешнюю переменную в блоке catch, если транзакция завершится с ошибкой.

  2. Выполните ручную операцию, используя DB :: BeginTransaction и откат/фиксации, снова обработчик исключений, согласно этому примеру:

 
    DB::beginTransaction(); 
    try { 
     $project = Project::find($id); 
     $project->users()->detach(); 
     $project->delete(); 
     DB::commit(); 
     $success = true; 
    } catch (\Exception $e) { 
     $success = false; 
     DB::rollback(); 
    } 

    if ($success) { 
     // the transaction worked ... 
    } 
+0

Я не забочусь об отчетности об ошибках. Мне просто нужно быть уверенным, что 2 запроса всегда работают вместе ... Не могли бы вы показать мне пример с ручной транзакцией? –

+0

Я отредактировал свой ответ, чтобы включить пример. – delatbabel

2

Вопрос довольно старый, но в моем мнений, нет способа добиться транзакций с механизмом хранения MyISAM.

Самая последняя версия сервера MySQL - 5.7, а в соответствующем справочном руководстве описывается, что механизм хранения MyISAM не поддерживает транзакции.

https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

Если я правильно знаю, начать, фиксации и заявления откатить принимаются без ошибок, но поведение отличается, чем ожидалось.

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