您的位置:首页 > 博客中心 > 数据库 >

记一个python+sqlalchemy+tornado的一个高并发下,产生重复记录的bug

时间:2022-03-13 22:36

场景:在用户通过支付通道支付完成返回时,发现我收到的处理数据记录中有两条同样的数据记录,

也就是同一笔钱,我数据库中记为了两条一样的记录。

tornado端代码

from tornado import gen
from tornado.concurrent import run_on_executor

class processNetPay(BaseHandler):
    ‘‘‘处理指定订单,指定支付请求,返回处理结果
    ‘ 返回包含订单信息与用户信息体
    ‘‘‘
    @tornado.web.asynchronous
    @gen.coroutine
    def post(self):
        ...other code....
        db_session = self.get_db_session()
        jsonResponse = yield self.query_netpay_order_state(db_session, netpay_id)

    @run_on_executor
    def query_netpay_order_state(self, db_session, netpay_id):
        ....
        with distributedlock(str("sync_netpay_%s" % netpay_id)):#分布式锁
            add NetPayRecord to db
            db_session.commit()

排除:一开始以为我没有使用分布式锁,或者没有在分布式锁内完成数据库的commit

但检查代码后,发现该提交的也提交了,该锁的也锁的了,不存在基本逻辑问题呀,怎么会在

NetPayRecord中产生了两条一样的记录呢?

解决:最后通过各项日志,及查看sqlalchemy源码后,发现db_session=self.get_db_session()需要写在锁内才行,

具体原因不表

 

记一个python+sqlalchemy+tornado的一个高并发下,产生重复记录的bug,布布扣,bubuko.com

热门排行

今日推荐

热门手游