请教大佬event 问题

liuqing

问题描述

我在一个function 里写了 Db::beginTransaction(); 可否在commit之前使用event? 我这样尝试去做测试,但是遇到一个问题,就是如果我event执行失败, 初始的function无法进行rollback. 请问这个可以有什么好的解决办法吗?

Db::beginTransaction();
try{
  xxxx;
  xxxx;
  event("订单处理事件");
}catch(Exception $e){
  Db::rollback;
  xxxx
}
258 1 0
1个回答

walkor

可以使用,事务注意事项参考 https://www.workerman.net/doc/webman/others/transaction.html

  • liuqing 2024-03-07

    您好,感谢回复,但是我按您给的文档尝试了不同的组合,依然无法生效.现给出我这边测试的样例,麻烦空了指教一下哈.

  • liuqing 2024-03-07

    测试function
    Db::beginTransaction();
    try{
    SysLog::insert([
    "device_id" => "123",
    "log" => "测试"
    ]);
    Event::emit('testevent', [], true);
    Db::commit();
    }catch (\Throwable $exception) {
    var_dump($exception->getMessage());
    Db::rollBack();
    }

  • liuqing 2024-03-07

    event内容(var_dump显示已正常进入event)
    function testevent(): void
    {
    var_dump("test_event");
    User::insert([
    "abc" => 123
    ]);
    }

  • liuqing 2024-03-07

    class SysLog extends Model
    {
    protected $fillable = [
    'device_id',
    'log',
    ];
    }
    class User extends Model
    {
    protected $fillable = [
    'user_id',
    ];
    }

  • liuqing 2024-03-07

    预期结果是,能拿到event抛出的异常,同时事务回滚.

  • walkor 2024-03-07

    Event::emit() 不会抛出异常, 用Event::dispatch()

  • liuqing 2024-03-07

    感谢!已解决!

  • liuqing 2024-03-07

    应该好好看看源码的!

🔝