@@ -160,6 +160,8 @@ def __init__(self, backend: DatabaseBackend) -> None:
160
160
self ._transaction_lock = asyncio .Lock ()
161
161
self ._transaction_stack = [] # type: typing.List[Transaction]
162
162
163
+ self ._query_lock = asyncio .Lock ()
164
+
163
165
async def __aenter__ (self ) -> "Connection" :
164
166
async with self ._connection_lock :
165
167
self ._connection_counter += 1
@@ -182,38 +184,44 @@ async def __aexit__(
182
184
async def fetch_all (
183
185
self , query : typing .Union [ClauseElement , str ], values : dict = None
184
186
) -> typing .List [typing .Mapping ]:
185
- return await self ._connection .fetch_all (self ._build_query (query , values ))
187
+ async with self ._self ._query_lock :
188
+ return await self ._connection .fetch_all (self ._build_query (query , values ))
186
189
187
190
async def fetch_one (
188
191
self , query : typing .Union [ClauseElement , str ], values : dict = None
189
192
) -> typing .Optional [typing .Mapping ]:
190
- return await self ._connection .fetch_one (self ._build_query (query , values ))
193
+ async with self ._self ._query_lock :
194
+ return await self ._connection .fetch_one (self ._build_query (query , values ))
191
195
192
196
async def fetch_val (
193
197
self ,
194
198
query : typing .Union [ClauseElement , str ],
195
199
values : dict = None ,
196
200
column : typing .Any = 0 ,
197
201
) -> typing .Any :
198
- row = await self ._connection .fetch_one (self ._build_query (query , values ))
202
+ async with self ._self ._query_lock :
203
+ row = await self ._connection .fetch_one (self ._build_query (query , values ))
199
204
return None if row is None else row [column ]
200
205
201
206
async def execute (
202
207
self , query : typing .Union [ClauseElement , str ], values : dict = None
203
208
) -> typing .Any :
204
- return await self ._connection .execute (self ._build_query (query , values ))
209
+ async with self ._self ._query_lock :
210
+ return await self ._connection .execute (self ._build_query (query , values ))
205
211
206
212
async def execute_many (
207
213
self , query : typing .Union [ClauseElement , str ], values : list
208
214
) -> None :
209
215
queries = [self ._build_query (query , values_set ) for values_set in values ]
210
- await self ._connection .execute_many (queries )
216
+ async with self ._self ._query_lock :
217
+ await self ._connection .execute_many (queries )
211
218
212
219
async def iterate (
213
220
self , query : typing .Union [ClauseElement , str ], values : dict = None
214
221
) -> 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 ._self ._query_lock :
223
+ async for record in self ._connection .iterate (self ._build_query (query , values )):
224
+ yield record
217
225
218
226
def transaction (self , * , force_rollback : bool = False ) -> "Transaction" :
219
227
return Transaction (self , force_rollback )
0 commit comments