>  기사  >  백엔드 개발  >  Laravel에서 데이터베이스 트랜잭션을 사용하고 트랜잭션 실패 후 예외 잡기

Laravel에서 데이터베이스 트랜잭션을 사용하고 트랜잭션 실패 후 예외 잡기

高洛峰
高洛峰원래의
2017-02-09 09:23:212209검색

설명

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(&#39;,&#39;, $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(&#39;,&#39;, $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 중국어 웹사이트로! ~

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.