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

Snippet 1 是否属于 Snippet 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

如果您只有一个数据库连接,并且您在一个事务中,那么您在数据库中所做的一切都必须是该事务的一部分。Laravel 不会为事件打开额外的数据库连接。

于 2018-02-19T15:11:41.240 回答