Laravel에서는 데이터베이스 트랜잭션에서 일련의 작업을 실행하려는 경우 DB Facade에서 트랜잭션 메서드를 사용할 수 있습니다. 트랜잭션 종료 내에서 예외가 발생하면 트랜잭션이 자동으로 복원됩니다. 클로저가 성공적으로 실행되면 트랜잭션이 자동으로 커밋됩니다. 트랜잭션 방법을 사용할 때 트랜잭션을 수동으로 되돌리거나 커밋하는 것에 대해 걱정할 필요가 없습니다.
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
트랜잭션 수동 작업
트랜잭션을 수동으로 처리하고 모든 권한을 갖고 싶은 경우 복원 또는 커밋 작업의 경우 DB Facade에서 beginTransaction
메소드를 사용할 수 있습니다:
DB::beginTransaction();
롤백 메소드를 통해 트랜잭션을 복원할 수도 있습니다:
DB::rollBack();
마지막으로 커밋 방법을 통한 트랜잭션:
DB::commit();
참고: DB Facade의 트랜잭션 방법은 쿼리문 빌더 및 Eloquent ORM의 트랜잭션을 제어하는 데에도 사용할 수 있습니다.
이 지식 포인트는 동시에 두 개의 다른 테스트 포인트에 속한다고 가정합니다. 즉, 테스트 포인트와 지식의 두 데이터입니다. 포인트가 다대다 관계인 경우 이 데이터 구조를 구현하려면 세 개의 테이블이 필요합니다.
지식 포인트 테이블 위키:
--------------------------------------- id title content ---------------------------------------
테스트 포인트 테이블 태그:
------------------- id name -------------------
테스트 포인트 지식 포인트 연관 테이블 wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
이제 위키 데이터를 추가하기 위해 트랜잭션을 시작해야 합니다. 새 위키가 성공적으로 추가된 후 이를 지정된 테스트 포인트와 연결합니다
( 쿼리 빌더 또는 Eloquent ORM을 사용하여 laravel에서 쿼리를 실행합니다. 실패하면 IlluminateDatabaseQueryException이 반환됩니다.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Database\QueryException; use App\Wiki; class TestController extends Controller { //用DB facade的事务方法控制 查询语句构建器的事务 public function storeWiki(Request $request) { DB::beginTransaction(); try { $tagIds = explode(',', $request->get('tag_id')); $wiki_id = DB::table('wiki')->insertGetId([ 'title' => $request->get('title'), 'content' => $request->get('content') ]); $relationData = []; foreach($tagIds as $tagId) { $data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId]; $relationData[] = $data; } DB::table('wiki_tag_rel')->insert($relationData); DB::commit(); } catch(\Illuminate\Database\QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } //用DB facade的事务方法控制 Eloquent ORM的事务 public function createWiki(array $data) { DB::beginTransaction(); try { $tagIds = explode(',', $data['tag_id']); $newWiki = Wiki::create([ 'title' => $data['title'], 'content' => $data['content'] ]); //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系 //通过attach方法来附加wiki和tag的关系(写入中间表) $newWiki->tags()->attach($tagIds); DB::commit(); } catch(QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } }
Laravel에서는 데이터베이스 트랜잭션에서 일련의 작업을 실행하려는 경우 다음의 transaction 메소드를 사용할 수 있습니다. DB파사드. 트랜잭션 종료 내에서 예외가 발생하면 트랜잭션이 자동으로 복원됩니다. 클로저가 성공적으로 실행되면 트랜잭션이 자동으로 커밋됩니다. 트랜잭션 방법을 사용할 때 트랜잭션을 수동으로 되돌리거나 커밋하는 것에 대해 걱정할 필요가 없습니다.
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
트랜잭션 수동 작업
트랜잭션을 수동으로 처리하고 모든 권한을 갖고 싶은 경우 복원 또는 커밋 작업의 경우 DB Facade에서 beginTransaction
메소드를 사용할 수 있습니다:
DB::beginTransaction();
롤백 메소드를 통해 트랜잭션을 복원할 수도 있습니다:
DB::rollBack();
마지막으로 커밋 메소드를 통한 트랜잭션:
DB::commit();
참고: DB Facade의 트랜잭션 메소드는 쿼리 생성자와 Eloquent ORM 트랜잭션을 제어하는 데에도 사용할 수 있습니다.
이 지식 포인트는 동시에 두 개의 다른 테스트 포인트에 속한다고 가정합니다. 즉, 테스트 포인트와 지식의 두 데이터입니다. 포인트가 다대다 관계인 경우 이 데이터 구조를 구현하려면 세 개의 테이블이 필요합니다.
지식 포인트 테이블 위키:
--------------------------------------- id title content ---------------------------------------
테스트 포인트 테이블 태그:
------------------- id name -------------------
테스트 포인트 지식 포인트 연관 테이블 wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
이제 위키 데이터를 추가하기 위해 트랜잭션을 시작해야 합니다. 위키가 성공적으로 추가된 후 이를 지정된 테스트 포인트와 연결
합니다. laravel에서 쿼리를 실행하기 위한 쿼리 빌더 또는 Eloquent ORM, 실패할 경우 IlluminateDatabaseQueryException 예외가 반환됩니다.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Database\QueryException; use App\Wiki; class TestController extends Controller { //用DB facade的事务方法控制 查询语句构建器的事务 public function storeWiki(Request $request) { DB::beginTransaction(); try { $tagIds = explode(',', $request->get('tag_id')); $wiki_id = DB::table('wiki')->insertGetId([ 'title' => $request->get('title'), 'content' => $request->get('content') ]); $relationData = []; foreach($tagIds as $tagId) { $data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId]; $relationData[] = $data; } DB::table('wiki_tag_rel')->insert($relationData); DB::commit(); } catch(\Illuminate\Database\QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } //用DB facade的事务方法控制 Eloquent ORM的事务 public function createWiki(array $data) { DB::beginTransaction(); try { $tagIds = explode(',', $data['tag_id']); $newWiki = Wiki::create([ 'title' => $data['title'], 'content' => $data['content'] ]); //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系 //通过attach方法来附加wiki和tag的关系(写入中间表) $newWiki->tags()->attach($tagIds); DB::commit(); } catch(QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } }
Laravel에서 데이터베이스 트랜잭션 사용 및 트랜잭션 실패 후 예외 캡처에 대한 자세한 관련 기사를 보려면 주의하세요. PHP 중국어 웹사이트로! ~