回答:
あなたはこれを行うことができます:
DB::transaction(function() {
//
});
クロージャー内のすべてがトランザクション内で実行されます。例外が発生すると、自動的にロールバックされます。
Discussed in more detail here
リンクが死んでいる。
無名関数が気に入らない場合:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
更新:laravel 4の場合、pdo
オブジェクトはもうパブリックではありません。
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
DB::beginTransaction()
&DB::commit()
&DB::rollback()
。それは少しクリーンになります。
DB::connection()->getPdo()->beginTransaction();
DB::transaction
withコールバックはもっと
Eloquentを使用する場合は、これも使用できます
これは私のプロジェクトのサンプルコードです
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
question->id
トランザクションコールバックでの式はゼロを返します。
閉鎖を避けたい場合、ファサードを使用したい場合は、次のようにすれば、きれいに保つことができます。
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
いずれかのステートメントが失敗した場合、コミットはヒットせず、トランザクションは処理されません。
私はあなたが閉鎖ソリューションを探していないと確信しています、よりコンパクトなソリューションのためにこれを試してください
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
何らかの理由でこの情報をどこにでも見つけるのは非常に難しいため、Eloquentトランザクションに関連する私の問題がこれを正確に変更していたため、ここに投稿することにしました。
読んだ後、これをスタックオーバーフローの回答を、データベーステーブルがInnoDBではなくMyISAMを使用していることに気付きました。
トランザクションがLaravel(または思われる他の場所)で機能するためには、テーブルがInnoDBを使用するように設定されている必要があります。
どうして?
MySQL トランザクションとアトミック操作のドキュメントの引用(ここ):
MySQLサーバー(バージョン3.23-maxおよびすべてのバージョン4.0以上)は、InnoDBおよびBDBトランザクションストレージエンジンでのトランザクションをサポートしています。InnoDBは、完全なACIDコンプライアンスを提供します。第14章「ストレージエンジン」を参照してください。トランザクションエラーの処理に関する標準SQLとのInnoDBの違いについては、セクション14.2.11「InnoDBエラー処理」を参照してください。
MySQLサーバーの他の非トランザクションストレージエンジン(MyISAMなど)は、「アトミック操作」と呼ばれるデータ整合性の異なるパラダイムに従います。トランザクションの観点から見ると、MyISAMテーブルは事実上常に自動コミット= 1モードで動作します。アトミック操作は、多くの場合、より高いパフォーマンスで同等の整合性を提供します。
MySQLサーバーは両方のパラダイムをサポートしているため、アトミック操作の速度とトランザクション機能の使用のどちらがアプリケーションに最適かを決定できます。この選択は、テーブルごとに行うことができます。
例外が発生した場合、トランザクションは自動的にロールバックされます。
Laravel Basicトランザクションフォーマット
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}