Как исключить некоторые операторы блока из транзакции - Laravel 5.7 - PullRequest
0 голосов
/ 05 марта 2019

Мне нужно, чтобы какой-то оператор (существующий в блоке транзакции) выполнялся непосредственно в базе данных без транзакции, например:

DB::beginTransaction();

//query A : insert or update to some tables in transaction

//**I need some of the result of (query A) to be saved in Database without transaction**

//insert or update to some tables in transaction

DB::commit();

1 Ответ

1 голос
/ 06 марта 2019

[РЕДАКТИРОВАТЬ] После прочтения вашего вопроса, похоже, я неправильно понял некоторые части.Если, сказав

, мне нужно, чтобы часть результата (запрос A) была сохранена в базе данных без транзакции

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


Вы можетепродублируйте соединение, которое вы используете для транзакции в database.php.Для этого примера предположим, что вы называете это 'mysql_outside_transaction'.После подключения по умолчанию у вас должно быть что-то подобное в файле database.php:

'mysql_outside_transaction' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

Оттуда, поскольку у вас есть второе доступное подключение к той же базе данных, вы можете использовать его для сохранения данныхвам нужно напрямую внутри транзакции.

Опять же, для примера, если у вас есть экземпляр $modelA, вы можете сказать ему использовать ваше второе соединение: $modelA->setConnection('mysql_outside_transaction');.После этого каждая операция базы данных, исходящая из этого экземпляра, будет выполняться вне вашей транзакции (поскольку она будет использовать второе настроенное вами соединение, а не то, которое использовалось для транзакции).

Не забудьте, что вы можете установитьсоединение использовать во многих отношениях.Это может быть непосредственно в атрибутах класса модели (protected $connection = 'your_connection';), с фасадом DB (DB::connection('your_connection');) и, возможно, другими способами, о которых я сейчас не думаю:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...