Skip to content
This repository was archived by the owner on Aug 19, 2025. It is now read-only.

Commit 6a0ec4c

Browse files
Query level locking
1 parent 2820ea4 commit 6a0ec4c

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

databases/core.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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,44 @@ 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._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._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._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._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._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._self._query_lock:
223+
async for record in self._connection.iterate(self._build_query(query, values)):
224+
yield record
217225

218226
def transaction(self, *, force_rollback: bool = False) -> "Transaction":
219227
return Transaction(self, force_rollback)

0 commit comments

Comments
 (0)