【Laravel】トランザクション処理
DBファサードを使用して実装する。基本の形は以下の感じ
code:php
public function useTransaction() {
// logファイルの定義
$log_path = storage_path() . '/logs/transaction.log';
$log = new Logger('Transaction');
$log->pushHandler(new StreamHandler($log_path, Logger::WARNING));
// 一緒にtry~catchで括ってしまうと良い
try {
$a =false;
// 引数はあってもなくてもOK
DB::transaction(function () use ($a) {
if (!$a) {
throw new Exception('value A の値がfalseです');
}
});
} catch (Exception $e) {
$log->error('正常に動作が終了しませんでした.');
$log->error(sprintf('%s %s %s', $e->getMessage(), $e->getFile(), $e->getLine()));
}
}
有りの場合
以下を実行しても、postは作成されない。
transaction処理の内部で例外処理が投げられると、自動的にロールバックが起こるから
code:php
try {
// post を挿入する処理
DB::transaction(function () {
$created_post = Post::create([
'message' => 'トランザクションで作ってます',
'picture' => 'transaction.pic',
'youtube_url' => 'transaction.youtube',
'good' => '0',
'user_id' => 116 // testアカウント
]);
throw new Exception('トランザクション有り!');
});
} catch (Exception $e) {
$log->error('正常に動作が終了しませんでした.');
$log->error(sprintf('%s %s %s', $e->getMessage(), $e->getFile(), $e->getLine()));
}
なしの場合
例外を投げていても、postは作られてしまう。
code:php
try {
// トランザクションなし
$created_post = Post::create([
'message' => 'トランザクションなしです',
'picture' => null,
'youtube_url' => null,
'good' => '0',
'user_id' => 116 // testアカウント
]);
throw new Exception('トランザクションなし。');
} catch (Exception $e) {
$log->error('正常に動作が終了しませんでした.');
$log->error(sprintf('%s %s %s', $e->getMessage(), $e->getFile(), $e->getLine()));
}