先贴代码:
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。
请问下各位表哥们,有遇到这种情况吗?该如何解决
=================================== 12.13更新: 后面跟公司运维确认,mysql做了主从,写和更新操作全是主库,查询操作是主库和从库一起,做负载均衡。
我遇到的这个问题是我要即时查询(数据一插入我就要立即查询),但是主库和从库同步时间有时候可能没那么快。
数据写入主库,但是我的查询全是走的从库,所以会遇到问题。
后来跟运维了解,我们好像用的是kingshard架构,查询的时候直接在sql之前加个 /master/ ,直接是在主库查询。
我就把查询改成了写原生sql:
db.session.execute(sql语句)
1
rogwan 2019-12-12 13:10:39 +08:00 via iPhone
如果读写并行,或者有主备的时候,可能出现这个情况,假如插入 100 条数据,在写 90 条的时候,来读取就会遗漏部分还在 session 里的数据。
|
4
lhx2008 2019-12-12 14:11:44 +08:00 via Android
一般就不管了,反正等会会插进去的。。要不你就强制主库查
|
6
simapple 2019-12-12 14:48:30 +08:00
session 的问题
|
8
wukangave 2019-12-12 14:59:35 +08:00
数据库经典的 read-after-write-consistency 问题。当写入后立即读取时,要保证从主节点读
|
10
exip 2019-12-12 16:04:17 +08:00 via Android
这好像是事务应该解决的问题.
|
11
jwchen 2019-12-13 17:02:48 +08:00
主从要想想办法自己控制去哪里读,实时性高的当然要价格 is_salve 之类的参数
|