ASP.NET Core ждет всех остальных потоков перед началом транзакции - PullRequest
1 голос
/ 27 марта 2019

Мне нужно выполнить несколько задач (пересчитать) на одной таблице с EF Core.Когда начинается этот расчет, никакая другая транзакция не должна начинаться.
Этого можно достичь с помощью Database.BeginTransactionAsync / TransactionScope?

Примерно так:

  • Поток 1 запускается.
  • Поток 1 вводит транзакцию
  • Поток 1 выполняет оператор выбора
  • Запуск потока 2.
  • Поток 2 вводит транзакцию (и ждите !!)
  • Поток 1 выполняет некоторую работу (поток 2 ожидает)
  • Поток 1 выполняет некоторые запросы (поток 2 ожидает)
  • Поток 1 сохраняет изменения в одной таблице (поток 2 ожидает))
  • Поток 1 завершает транзакцию (будет выполняться код в потоке 2)
  • Код потока 2 выполняется

Я вижу четыре возможных способа сделать это, ноопции 1, 2 и 4 не работают:

  1. DbContext.Database.BeginTransaction (если 2 метода (2 вызова API) вызывают это, второй должен ждать)
  2. new TransactionScope(TransactionScopeAsyncFlowOption.Enabled) (если 2 метода (2 вызова API) вызывают это, второй должен ждать)
  3. Создайте некоторую статическую переменную и используйте lock(static_variable)
  4. Таблица блокировки, ноон не работает

Любая блокировка базы данных / таблицы будет лучше, поскольку это также гарантирует работу, выполненную, например, в Management Studio.Я также попытался:

BEGIN TRANSACTION;
SELECT top 1 1 FROM [Transactions] WITH (TABLOCKX, HOLDLOCK)

, но я мог позвонить select в другой студии управления, поэтому таблица не была заблокирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...