V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Raul7
V2EX  ›  Python

flask-sqlalchemy 新增数据入库,然后马上查询,会有查询不到数据的情况?

  •  
  •   Raul7 · 2019-12-12 12:41:07 +08:00 · 4441 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先贴代码:

    try:
      # 判断表中数据是否存在,存在更新,不存在新增
      if not existing:
          db.session.execute(
              ServiceAsset.__table__.insert(),
              [{'xxx': xxx}]
          )
      else:
          ServiceAsset.query.filter_by(host_id=xxx, port=xxx).update({'xxx':'xxx'})
      db.session.commit()
    except Exception as e:
      db.session.rollback()
    
    # ServiceAsset 表数据入库后,马上在 ServiceAsset 表进行一个查询获取 ServiceAsset 表的 id
    try:
      service_asset_query = ServiceAsset.query.filter(and_(xx=xx, xxx=xxx)).all()
      if not service_asset_query:
          log.write('info', None, 0, u'在 ServiceAsset 中根据 xx 和 xxx 未获取到资产信息')
          pass
      for saq in service_asset_query:
          service_id_cur = saq.service_id
    except Exception as e:
        db.session.rollback()
    

    大概插入了几百条数据,其中会有几条获取不到 service_asset_query。 Qyh7zF.png

    请问下各位表哥们,有遇到这种情况吗?该如何解决

    第 1 条附言  ·  2019-12-13 14:45:14 +08:00

    =================================== 12.13更新: 后面跟公司运维确认,mysql做了主从,写和更新操作全是主库,查询操作是主库和从库一起,做负载均衡。

    我遇到的这个问题是我要即时查询(数据一插入我就要立即查询),但是主库和从库同步时间有时候可能没那么快。

    数据写入主库,但是我的查询全是走的从库,所以会遇到问题。

    后来跟运维了解,我们好像用的是kingshard架构,查询的时候直接在sql之前加个 /master/ ,直接是在主库查询。

    我就把查询改成了写原生sql:

    db.session.execute(sql语句)
    
    第 2 条附言  ·  2019-12-13 14:46:35 +08:00
    sql 语句前加 /*master*/ 默认走主库。每个架构不一样,需要跟运维确认下
    11 条回复    2019-12-13 17:02:48 +08:00
    rogwan
        1
    rogwan  
       2019-12-12 13:10:39 +08:00 via iPhone
    如果读写并行,或者有主备的时候,可能出现这个情况,假如插入 100 条数据,在写 90 条的时候,来读取就会遗漏部分还在 session 里的数据。
    Raul7
        2
    Raul7  
    OP
       2019-12-12 13:43:17 +08:00
    @rogwan 那要怎么解决啊 我这边应该是有主备
    wangyzj
        3
    wangyzj  
       2019-12-12 14:08:04 +08:00
    @Raul7 不是同一个节点?
    lhx2008
        4
    lhx2008  
       2019-12-12 14:11:44 +08:00 via Android
    一般就不管了,反正等会会插进去的。。要不你就强制主库查
    Raul7
        5
    Raul7  
    OP
       2019-12-12 14:46:24 +08:00
    @lhx2008 我贴的代码后面的过程是要入库另一张表,有几条没查出结果,我另一张表的数据全乱了
    simapple
        6
    simapple  
       2019-12-12 14:48:30 +08:00
    session 的问题
    Raul7
        7
    Raul7  
    OP
       2019-12-12 14:58:19 +08:00
    @wangyzj 有主从 写和更新操作都是直接主库 读是主从一起
    wukangave
        8
    wukangave  
       2019-12-12 14:59:35 +08:00
    数据库经典的 read-after-write-consistency 问题。当写入后立即读取时,要保证从主节点读
    wangyzj
        9
    wangyzj  
       2019-12-12 15:05:43 +08:00
    @Raul7 有主从
    这就是不是 sqlalchemy 的问题了
    主从不是绝对实时啊
    exip
        10
    exip  
       2019-12-12 16:04:17 +08:00 via Android
    这好像是事务应该解决的问题.
    jwchen
        11
    jwchen  
       2019-12-13 17:02:48 +08:00
    主从要想想办法自己控制去哪里读,实时性高的当然要价格 is_salve 之类的参数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2617 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.