3

イベントが Laravel のクロージャー トランザクション関数内から起動された場合、イベント内のデータベース操作もトランザクションの一部ですか、それともトランザクションの外にありますか?

Snippet 1
    Event::listen('fireme',function($data){
         User::where('votes', '>', 100)->update(array('status' => 2));
    });

Snippet 2
    DB::transaction(function(){
            User::where('votes', '>', 100)->update(array('email' => 'something@somewebsite.com'));
            Event::fire('fireme',array('email' => 'something@somewebsite.com'));
    });

スニペット 1 は、スニペット 2 で定義されたトランザクションに属しますか?

4

2 に答える 2

1

まったく同じ質問がありました。

@alexandre-danault の提案に従って、イベントがトランザクション内から発生するイベント ハンドラー内で例外がスローされると、トランザクションがロールバックすることを確認できます。この回答を掲載すると、最初に独自のテストを実行する必要がなくなる可能性があると考えました。これが私のコードスニペットです(私はトランザクションの閉鎖形式を使用していません):

// I throw an exception from within this event handler
Event::listen('transaction.statusChange', 'TransactionHandler@onStatusChange');

// Here's the transaction that fires the event
DB::beginTransaction();
try {
    $this->status = $status;
    if (!$this->save()){
        throw new Exception('...');
    }
    Event::fire('transaction.statusChange', ['transaction' => $this, 'status' => $status]);
} catch(Exception $e){
    DB::rollback();
    // Log exception

    return false;
}
DB::commit();
于 2014-10-15T09:34:35.500 に答える
1

データベース接続が 1 つしかなく、トランザクション内にいる場合、データベースで行うことはすべてそのトランザクションの一部でなければなりません。Laravel は、イベントのために追加のデータベース接続を開きません。

于 2018-02-19T15:11:41.240 に答える