@@ -160,6 +160,8 @@ def __init__(self, backend: DatabaseBackend) -> None:
160160 self ._transaction_lock = asyncio .Lock ()
161161 self ._transaction_stack = [] # type: typing.List[Transaction]
162162
163+ self ._query_lock = asyncio .Lock ()
164+
163165 async def __aenter__ (self ) -> "Connection" :
164166 async with self ._connection_lock :
165167 self ._connection_counter += 1
@@ -182,38 +184,46 @@ async def __aexit__(
182184 async def fetch_all (
183185 self , query : typing .Union [ClauseElement , str ], values : dict = None
184186 ) -> typing .List [typing .Mapping ]:
185- return await self ._connection .fetch_all (self ._build_query (query , values ))
187+ async with self ._query_lock :
188+ return await self ._connection .fetch_all (self ._build_query (query , values ))
186189
187190 async def fetch_one (
188191 self , query : typing .Union [ClauseElement , str ], values : dict = None
189192 ) -> typing .Optional [typing .Mapping ]:
190- return await self ._connection .fetch_one (self ._build_query (query , values ))
193+ async with self ._query_lock :
194+ return await self ._connection .fetch_one (self ._build_query (query , values ))
191195
192196 async def fetch_val (
193197 self ,
194198 query : typing .Union [ClauseElement , str ],
195199 values : dict = None ,
196200 column : typing .Any = 0 ,
197201 ) -> typing .Any :
198- row = await self ._connection .fetch_one (self ._build_query (query , values ))
202+ async with self ._query_lock :
203+ row = await self ._connection .fetch_one (self ._build_query (query , values ))
199204 return None if row is None else row [column ]
200205
201206 async def execute (
202207 self , query : typing .Union [ClauseElement , str ], values : dict = None
203208 ) -> typing .Any :
204- return await self ._connection .execute (self ._build_query (query , values ))
209+ async with self ._query_lock :
210+ return await self ._connection .execute (self ._build_query (query , values ))
205211
206212 async def execute_many (
207213 self , query : typing .Union [ClauseElement , str ], values : list
208214 ) -> None :
209215 queries = [self ._build_query (query , values_set ) for values_set in values ]
210- await self ._connection .execute_many (queries )
216+ async with self ._query_lock :
217+ await self ._connection .execute_many (queries )
211218
212219 async def iterate (
213220 self , query : typing .Union [ClauseElement , str ], values : dict = None
214221 ) -> typing .AsyncGenerator [typing .Any , None ]:
215- async for record in self ._connection .iterate (self ._build_query (query , values )):
216- yield record
222+ async with self ._query_lock :
223+ async for record in self ._connection .iterate (
224+ self ._build_query (query , values )
225+ ):
226+ yield record
217227
218228 def transaction (self , * , force_rollback : bool = False ) -> "Transaction" :
219229 return Transaction (self , force_rollback )
0 commit comments