场景:在用户通过支付通道支付完成返回时,发现我收到的处理数据记录中有两条同样的数据记录,
也就是同一笔钱,我数据库中记为了两条一样的记录。
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
原文地址:http://www.cnblogs.com/byshome/p/3892761.html