Синхронизация базы данных может быть достигнута с использованием транзакций. В случае асинхронных баз данных, таких как asyncpg, вы можете использовать Connection.transaction() для создания транзакции вокруг вашей операции.
Вам потребуется создать функцию-обработчик команды /minus, которая будет выполнять все необходимые операции в рамках одной транзакции. Когда эта функция вызывается одновременно из разных чатов, каждая будет выполняться в отдельной транзакции и не влиять на другие транзакции.
Ниже приведен пример, как вы можете изменить ваш код для достижения синхронизации базы данных:
```python
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import asyncpg
import asyncio
# Создаем объект бота и хранилище состояний
bot = Bot(token='TOKEN')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
# Создаем пул соединений к БД
pool = await asyncpg.create_pool(database='DATABASE', user='USER', password='PASSWORD', host='HOST')
# Функция для обработки команды /minus
async def minus_command_handler(message: types.Message):
async with pool.acquire() as con: # Подключаемся к БД
async with con.transaction(): # Создаем транзакцию
# Ваш код для выполнения операций с базой данных
await con.execute("UPDATE ...")
await con.execute("INSERT ...")
...
# Регистрируем обработчик команды /minus
dp.register_message_handler(minus_command_handler, commands=['minus'])
# Запускаем бота
executor = aiogram.executor.Executor(dp)
executor.start_polling()
```
Каждый экземпляр функции `minus_command_handler()` будет выполняться в отдельной транзакции, что обеспечит синхронизацию данных.
Использование блокировки `asyncio.Lock()` может быть хорошим решением, если вам нужно обеспечить синхронизацию только для определенных операций в пределах одной транзакции. Однако, если вы хотите синхронизировать всю транзакцию, использование транзакций с явным управлением, как описано выше, может быть более простым и эффективным решением.