Мне нужно выполнить несколько задач (пересчитать) на одной таблице с EF Core.Когда начинается этот расчет, никакая другая транзакция не должна начинаться.
Этого можно достичь с помощью Database.BeginTransactionAsync
/ TransactionScope
?
Примерно так:
- Поток 1 запускается.
- Поток 1 вводит транзакцию
- Поток 1 выполняет оператор выбора
- Запуск потока 2.
- Поток 2 вводит транзакцию (и ждите !!)
- Поток 1 выполняет некоторую работу (поток 2 ожидает)
- Поток 1 выполняет некоторые запросы (поток 2 ожидает)
- Поток 1 сохраняет изменения в одной таблице (поток 2 ожидает))
- Поток 1 завершает транзакцию (будет выполняться код в потоке 2)
- Код потока 2 выполняется
Я вижу четыре возможных способа сделать это, ноопции 1, 2 и 4 не работают:
DbContext.Database.BeginTransaction
(если 2 метода (2 вызова API) вызывают это, второй должен ждать) new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)
(если 2 метода (2 вызова API) вызывают это, второй должен ждать) - Создайте некоторую статическую переменную и используйте
lock(static_variable)
- Таблица блокировки, ноон не работает
Любая блокировка базы данных / таблицы будет лучше, поскольку это также гарантирует работу, выполненную, например, в Management Studio.Я также попытался:
BEGIN TRANSACTION;
SELECT top 1 1 FROM [Transactions] WITH (TABLOCKX, HOLDLOCK)
, но я мог позвонить select
в другой студии управления, поэтому таблица не была заблокирована.