Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Datenbanktransaktionen in Laravel und Abfangen von Ausnahmen nach Transaktionsfehlern

Verwendung von Datenbanktransaktionen in Laravel und Abfangen von Ausnahmen nach Transaktionsfehlern

高洛峰
高洛峰Original
2017-02-09 09:23:212259Durchsuche

Beschreibung

Wenn Sie in Laravel eine Reihe von Vorgängen in einer Datenbanktransaktion ausführen möchten, können Sie die Transaktionsmethode in der DB-Fassade verwenden. Wenn beim Schließen einer Transaktion eine Ausnahme ausgelöst wird, wird die Transaktion automatisch wiederhergestellt. Wenn der Abschluss erfolgreich ausgeführt wird, wird die Transaktion automatisch festgeschrieben. Sie müssen sich keine Gedanken darüber machen, die Transaktion manuell rückgängig zu machen oder zu bestätigen, wenn Sie die Transaktionsmethode verwenden:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

Manuelles Ausführen der Transaktion

Wenn Sie die Transaktion manuell bearbeiten und durchführen möchten Wiederherstellungs- oder Commit-Vorgang Wenn Sie die volle Kontrolle haben, können Sie die beginTransaction-Methode auf der DB-Fassade verwenden:

DB::beginTransaction();

Sie können die Transaktion auch über die RollBack-Methode wiederherstellen:

DB::rollBack();

Schließlich können Sie es über die Commit-Methode senden. Diese Transaktion:

DB::commit();

Hinweis: Die Transaktionsmethode der DB-Fassade kann auch verwendet werden, um die Transaktion des Abfrageanweisungs-Builders und des Eloquent ORM zu steuern.

Beispiel

Angenommen, Sie möchten einen Wissenspunkt in der Datenbank speichern. Dieser Wissenspunkt gehört zu zwei verschiedenen Testpunkten gleichzeitig Wenn es sich bei den Punkten um eine Viele-zu-Viele-Beziehung handelt, werden drei Tabellen benötigt, um diese Datenstruktur zu implementieren:

Wiki zur Wissenspunkttabelle:

---------------------------------------
id       title              content
---------------------------------------

Tag der Testpunkttabelle:

-------------------
id       name
-------------------

Testpunktwissen Klicken Sie auf die Zuordnungstabelle wiki_tag_rel

----------------------------------
id          tag_id        wiki_id
----------------------------------

Jetzt müssen Sie die Transaktion öffnen, um Wiki-Daten hinzuzufügen. Nachdem das neue Wiki erfolgreich hinzugefügt wurde, verknüpfen Sie es mit dem angegebenen Testpunkt

(Verwenden Sie den Abfrage-Builder in Laravel. Oder wenn Eloquent ORM eine Abfrage ausführt und diese fehlschlägt, wird IlluminateDatabaseQueryException zurückgegeben)

<?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']);
     }

}

                                     

Beschreibung

Wenn Sie in Laravel eine Reihe von Vorgängen in einer Datenbanktransaktion ausführen möchten, können Sie die Transaktionsmethode in verwenden DB-Fassade. Wenn beim Schließen einer Transaktion eine Ausnahme ausgelöst wird, wird die Transaktion automatisch wiederhergestellt. Wenn der Abschluss erfolgreich ausgeführt wird, wird die Transaktion automatisch festgeschrieben. Sie müssen sich keine Gedanken darüber machen, die Transaktion manuell rückgängig zu machen oder zu bestätigen, wenn Sie die Transaktionsmethode verwenden:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

Manuelles Ausführen der Transaktion

Wenn Sie die Transaktion manuell bearbeiten und durchführen möchten Wiederherstellungs- oder Commit-Vorgang Wenn Sie die volle Kontrolle haben, können Sie die beginTransaction-Methode auf der DB-Fassade verwenden:

DB::beginTransaction();

Sie können die Transaktion auch über die RollBack-Methode wiederherstellen:

DB::rollBack();

Schließlich können Sie es über die Commit-Methode senden. Diese Transaktion:

DB::commit();

Hinweis: Die Transaktionsmethode der DB-Fassade kann auch verwendet werden, um die Transaktion des Abfrageanweisungs-Builders und des Eloquent ORM zu steuern.

Beispiel

Angenommen, Sie möchten einen Wissenspunkt in der Datenbank speichern. Dieser Wissenspunkt gehört zu zwei verschiedenen Testpunkten gleichzeitig Punkte sind eine Viele-zu-Viele-Beziehung, dann werden drei Tabellen benötigt, um diese Datenstruktur zu implementieren:

Wiki zur Wissenspunkttabelle:

---------------------------------------
id       title              content
---------------------------------------

Tag der Testpunkttabelle:

-------------------
id       name
-------------------

Testpunktwissen Klicken Sie auf die Zuordnungstabelle wiki_tag_rel

----------------------------------
id          tag_id        wiki_id
----------------------------------

Jetzt müssen Sie die Transaktion öffnen, um Wiki-Daten hinzuzufügen. Nachdem das neue Wiki erfolgreich hinzugefügt wurde, verknüpfen Sie es mit dem angegebenen Testpunkt

(Verwenden Sie den Abfrage-Builder in Laravel. Oder wenn Eloquent ORM eine Abfrage ausführt und diese fehlschlägt, wird eine IlluminateDatabaseQueryException-Ausnahme zurückgegeben.)

<?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']);
     }

}

Weitere verwandte Artikel zur Verwendung von Datenbanktransaktionen in Laravel und das Erfassen von Ausnahmen nach Transaktionsfehlern beachten Sie bitte die chinesische PHP-Website!                                                                                        

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn