2015-06-11 1 views
3

У меня возникают проблемы с откатом транзакции, включающей таблицы из нескольких баз данных. Откат первичной таблицы ведет себя так, как ожидалось, но дочерняя строка остается и теперь остается сиротой.Laravel 4.2 - Проблема отката транзакций с несколькими базами данных

public function devUserCreateTest() 
{ 
    DB::beginTransaction(); 

    try { 

     $childUser = new ChildUser; // Exists in database B 
     $parentUser = new User; // Exists in database A 

     $parentUser->setEmailAttribute('[email protected]'); 

     $parentUser->save(); 

     $childUser->parent_user_id = $parentUser->id; 

     $message = sprintf('Parent user id: %s', serialize($childUser->id)); 

     $childUser->save(); 

     $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id)); 

     throw new Exception('Testing....'); 

     DB::commit(); 

    } catch (Exception $e) { 

     Log::warning(sprintf('Exception: %s', $e->getMessage())); 

     DB::rollback(); 
    } 

    return $this->buildResponse(array('message' => $message)); 
} 

Похоже, это работает:

public function devUserCreateTest() 
{ 
    $dboA = DB::connection(); 
    $dboB = DB::connection('b_database'); 

    $dboA->beginTransaction(); 
    $dboB->beginTransaction(); 

    try { 

     $childUser = new ChildUser; // Exists in database B 
     $parentUser = new User; // Exists in database A 

     $parentUser->setEmailAttribute('[email protected]'); 

     $parentUser->save(); 

     $childUser->parent_user_id = $parentUser->id; 

     $message = sprintf('Parent user id: %s', serialize($childUser->id)); 

     $childUser->save(); 

     $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id)); 

     throw new Exception('Testing....'); 

     $dboA->commit(); 
     $dboB->commit(); 

    } catch (Exception $e) { 

     Log::warning(sprintf('Exception: %s', $e->getMessage())); 

     $dboA->rollback(); 
     $dboB->rollback(); 
    } 

    return $this->buildResponse(array('message' => $message)); 
} 

ответ

1

Вы должны установить сделку по базе данных B также.

Поскольку вы не проводки ChildUser кода, вот пример:

приложения/модель/ChildUser.php:

class ChildUser extends Eloquent 
{ 
    protected $connection = 'some_connection'; // as defined in app/config/database.php 
} 

Тогда ваш код

public function devUserCreateTest() 
{ 
    DB::beginTransaction(); 
    DB::connection('some_connection')->beginTransaction(); // same as the one used in model ChildUser 

    try { 

     $childUser = new ChildUser; // Exists in database B 
     $parentUser = new User; // Exists in database A 
     $parentUser->setEmailAttribute('[email protected]'); 
     $parentUser->save(); 
     $childUser->parent_user_id = $parentUser->id; 
     $message = sprintf('Parent user id: %s', serialize($childUser->id)); 
     $childUser->save(); 
     $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id)); 
     throw new Exception('Testing....'); 
     DB::commit(); 
    } catch (Exception $e) { 
     Log::warning(sprintf('Exception: %s', $e->getMessage())); 

     DB::rollback(); 
     DB::connection('some_connection')->rollback(); 
    } 
    return $this->buildResponse(array('message' => $message)); 
} 
+0

Thx для ответа ... кажется, вы правы, мне нужно локализовать два отдельных объекта базы данных, затем инициализировать , и фиксация/откат по каждому соединению. –

+0

Нет необходимости в фиксации после? – OskarD90

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