Максимальная асинхронная последовательность и проблема взаимоблокировки - PullRequest
0 голосов
/ 24 января 2019

Веб-метод реализует следующие вещи

//Job 1: Check max sequence: check the database tblA and find the max sequence 
//Job 2: Create tblA: create tblA record where sequence = Job 1's sequence
//Job 3: Create tblB: create tblB record where created tblA an added field in it

Веб-метод принимает массив размера N.N раз Задания 1 - Задание 3 будет выполняться для каждого запроса.

Задания 2 и 3 будут находиться в той же области действия транзакции (откатить оба изменения в случае любой причины сбоя)

Работаетнормально, когда только 1 поток запрашивает этот API (синхронно)

Проблемы возникали, когда два потока запрашивали его одновременно

Если 2 потока запрашивают этот API, то Задание 1 имеет возможность вернутьсяДублированная максимальная последовательность

В случае, если оба 3 задания находятся в области транзакции, возникнет взаимоблокировка (должным образом, из-за того, что в потоке 1 найдено максимальное число tblA, и продолжается создание tblB (нужен созданный tblA).поток 2 пытается найти максимальную последовательность (нужен созданный потоком 1 tblA), во время создания таблицы tblA произошла тупиковая ситуация))

Ниже приведен код для поиска максимальной последовательности

public int GetMaxSequence()
        {
            var docList = pmsContext.tblA.Where().ToArray();
            var doc = docList.OrderByDescending(x => x.Sequence).FirstOrDefault();
            int seq = 1;
            if (doc != null && doc.Sequence.HasValue)
                seq = doc.Sequence.Value + 1;
            return seq;
        }

Есть лиспособ решить эту проблему?

Чтобы в задании 1 была найдена максимальная последовательность (без дубликатов), без тупиков.

Спасибо.

...