码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2014-08-05 19:03:49      阅读:1248      评论:0      收藏:0      [点我收藏+]

标签:blog   使用   os   io   数据   问题   代码   div   

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

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

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

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

标签:blog   使用   os   io   数据   问题   代码   div   

原文地址:http://www.cnblogs.com/byshome/p/3892761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!