问题描述 用我自己封装的这个模块 会出现好几个问题
两者都在我重启项目之后正常了 我感觉是缓存的问题
那个 select 有缓存真的是醉了 读不到最新的数据 而且 cls.pool = None 就完全发挥不了连接池的作用了 求帮忙
class AioMysqlHelper:
pool = None
@classmethod
async def get_pool(cls):
if not cls.pool:
cls.pool = await aiomysql.create_pool(**Config.mysql)
return cls.pool
@classmethod
async def insert(cls, sql, params=None):
params = params or []
await cls.get_pool()
async with cls.pool.acquire() as conn:
async with conn.cursor() as cur:
try:
await cur.execute(sql, params)
await cur.execute("commit;")
await conn.commit()
except Exception as err:
await conn.rollback()
raise err
cls.pool = None
@classmethod
async def select(cls, sql, params=None, one=True):
params = params or []
await cls.get_pool()
async with cls.pool.acquire() as conn:
async with conn.cursor() as cur:
try:
await cur.execute(sql, params)
return await (cur.fetchone() if one else cur.fetchall())
except Exception as err:
conn.rollback()
raise err
1
janxin 2019-03-21 00:25:00 +08:00 via iPhone
考虑过脏读幻读问题么
|
2
nightstart OP @janxin 幻读脏读应该是在并发比较大的情况下出现的吧。 我的操作是顺序操作 比如上面插入了一条记录 然后紧接着下一个操作是去把这条记录通过条件读出来 然后就遇到了这种情况
|
3
Trim21 2019-03-21 01:47:34 +08:00
我试了一下没法复现...
https://gist.github.com/Trim21/b5f77e819d7fdc0ccd1364c2f563ab4e 你具体调用这个库的代码和 Config.mysql 是什么样的 |
4
pynix 2019-03-21 03:00:36 +08:00
估计你没理解 aio
|
6
nightstart OP @Trim21 你好我弄了一个 demo 能百分百复现问题的 但是 V2EX 的帖子无法编辑 ....
|
7
nightstart OP ```
# -*- coding: utf-8 -*- import time import asyncio from app.utils.aiomyob import AioMysqlHelper async def select(): for _ in range(10): await asyncio.sleep(1) print(await AioMysqlHelper.select("SELECT * FROM test", one=False)) async def main(): await asyncio.gather(*[select() for _ in range(1)]) if __name__ == "__main__": start = time.time() loop = asyncio.get_event_loop() loop.run_until_complete(AioMysqlHelper.init_pool()) loop.run_until_complete(main()) loop.close() print(time.time() - start) ``` 先在数据库里面手动插入一条数据 在十次 print 的过程中 挑个时间在数据库中手动执行 delete from test; 输出是这样的 ``` [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] () [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] [{'id': 24, 'name': 'wwww'}] () ``` |