首页 > 代码库 > 记一个python+sqlalchemy+tornado的一个高并发下,产生重复记录的bug

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

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

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

tornado端代码

from tornado import genfrom tornado.concurrent import run_on_executorclass 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()需要写在锁内才行,

具体原因不表