问题描述 用我自己封装的这个模块 会出现好几个问题
两者都在我重启项目之后正常了 我感觉是缓存的问题
那个 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 |
5 yemoluo 2019-03-21 08:09:52 +08:00 @pynix 同意楼上,你用同步思维的方式来写异步代码,insert 还没执行完的时候,select 就开始执行了,那就没数据了 |
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'}] () ``` |