* DatabaseHandler 에서 생성된 VirtualConnection 의 여러개의 database connection 을
하나의 transaction 으로 관리
- DatabaseHandler 에 의해 생성된 VirtualConnection 들의 transaction 관리
- 각 VirtualConnection 가 갖는 connection 들은 연관성 없는 transaction 으로 처리됨
- TransactionHandler 로 단일 connection 같이 처리
- 하나 이상의 물리적으로 다른 connection 을 동일한 transaction 으로 처리
## 사용법
### Transaction
* VirtualConnection 통해 TransactionHandler 에서 처리
php
XeDB::beginTransaction();
XeDB::commit();
XeDB::rollBack();
/** * 실제 처리 될 connection 을 생성해서 반환. * > $name 은 config/database.php 에 설정 된 이름이며 * config/xe.php database 에서 참조됨. * * @param null|string $connectionName database name * @return \Illuminate\Database\Connection */ public function connect($connectionName = null) { if ($connectionName === 'default') { $connectionName = null; } $connection = $this->databaseManager->connection($connectionName); $this->transaction->setCurrent($connection); return $connection; }
/** * Register the service provider. * * @return void */ public function register() { DynamicModel::clearBootedModels(); $this->app->singleton('xe.db.proxy', function ($app) { return ProxyManager::instance($app['xe.register']); }); $this->app->singleton(['xe.db' => DatabaseHandler::class], function ($app) { $coupler = DatabaseCoupler::instance($app['db'], TransactionHandler::instance(), $app['xe.db.proxy'], new LaravelCache($app['cache']->driver('schema'))); $proxyClass = $app['xe.interception']->proxy(DatabaseHandler::class, 'XeDB'); return new $proxyClass($coupler, $app['config']->get('xe.database')); }); }
/** * set up * * @return void */ public function setUp() { $transaction = TransactionHandler::instance(); $this->transaction = $transaction; }