webman 两次请求,事务会互相影响

hooper55

结论是不使用异步代码就不会互相影响

结论是不使用异步代码就不会互相影响


问题描述

先访问(开启事务):
/?transaction=1
再访问(不用事务)
/

结果是数据不会被写入。

因为两次请求,用的connection是同一个,所以会互相影响,数据库连接应该 每个请求独立分开。

虽然我用的是timer计时器,但是在高并发且有大量非阻塞行为的时候,还是有可能触发一样的问题。

程序代码或配置


    public function index(Request $request)
    {
        $connection = Db::connection('default');
        if ($request->get('transaction')) {

            $connection->beginTransaction();

            \Workerman\Timer::add(5, function () use ($connection) {
                $connection->rollback();
                echo "rollback\r\n";
            }, [], false);
        } else {
            $connection->table('application')->insert([[
                'id' => mt_rand(100, 99999),
                'author_id' => '11',
                'maintainer_id' => '11',
                'title' => 'notransaction',
                'web' => 'notransaction',
                'slogan' => 'notransaction',
            ]]);
        }
        return response('hello webman');
    }
851 2 0
2个回答

walkor

webman常驻内存的,数据库连接是每个请求公用的。每个请求应该独自完成事物的提交或者回滚

  • hooper55 2023-06-11

    大佬测试了吗,现在就是多个请求会共用链接。

    忘了说的是,只开一个进出

  • hooper55 2023-06-11

    我晚点试试不用timer 会不会出现

  • hooper55 2023-06-11

    实测下来,不使用异步的代码确实不会互相影响

Le

如果异步会影响,那队列这种,也会影响?

  • walkor 2023-06-12

    队列是另外的进程了,根本影响不到。

  • Le 2023-06-12

    那就放心了...

  • hooper55 2023-06-13

    队列不影响。如果是异步回调里才做commit 或rollback会有影响

🔝