has('database.connections.pgsql_supplier')) { return; } $defaultConnection = DB::connection('pgsql'); $supplierConnection = DB::connection('pgsql_supplier'); $supplierConnection->setPdo($defaultConnection->getPdo()); $supplierConnection->setReadPdo($defaultConnection->getReadPdo()); // Шарим не только PDO, но и уровень вложенности транзакции. DatabaseTransactions // уже открыл транзакцию на pgsql (этот же PDO) к моменту setUp этого трейта. // Без синхронизации supplier-connection считает transactions=0 и при // DB::connection('pgsql_supplier')->transaction() зовёт PDO->beginTransaction() // на уже активной транзакции → PDOException "There is already an active transaction" // (например AdminIncidentsController::notifyRkn). С синхронизацией вложенный // transaction() делает SAVEPOINT внутри внешней транзакции (Postgres поддерживает), // запись видна последующим чтениям и откатывается общим rollback'ом в teardown. $level = $defaultConnection->transactionLevel(); if ($level > 0) { $prop = new \ReflectionProperty(Connection::class, 'transactions'); $prop->setAccessible(true); $prop->setValue($supplierConnection, $level); } } }