场景是这样的:
在添加完数据后,给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();
}
网友评论