记一次thinkphp-swoole查不到数据的bug

2020-12-06  本文已影响0人  翊痕

场景是这样的:

在添加完数据后,给swoole进程发送一个消息,在swoole的task进程中去处理这条数据。

但是出现了一个奇怪的问题,就是时不时swoole处理数据会失败,打断点,发现swoole中查不到这条数据,但是去数据库一看,这条数据明明已经插入了,但是为什么会查不到数据呢?

原来 我在thinkphp代码中插入数据时,启用了事务,发送消息的代码写在了提交事务之前,

Db::startTrans();

try {

    step1 插入数据代码;

    step2 发送swoole消息代码

    Db::commit();

} catch (Exception $e) {

    Db::rollback();

    Log::error($e->getMessage());

    Log::error($e->getTraceAsString());

    return $this->error();

}

因为swoole是单独进程,如果swoole进程在获取这条数据时,数据还未提交,那么在swoole进程是获取不到这条数据的。所有将代码顺序调整一下即可,在事务提交后再发送消息即可。

Db::startTrans();

try {

    step1 插入数据代码;

    Db::commit();

    step2 发送swoole消息代码

} catch (Exception $e) {

    Db::rollback();

    Log::error($e->getMessage());

    Log::error($e->getTraceAsString());

    return $this->error();

}

上一篇下一篇

猜你喜欢

热点阅读