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

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

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

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,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。