SQL Сервер получает и обновляет одни и те же записи при использовании параллельной библиотеки - PullRequest
1 голос
/ 10 января 2020

Я запускаю приведенный ниже код, который запускает несколько функций, и теоретически обе функции и все строки в наборе записей происходят параллельно. Я знаю, что это не буквально, но достаточно близко, что касается SQL Сервер.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я получаю значение из таблицы последовательности, то же значение возвращается для нескольких вызовов , Я подозреваю, что я должен использовать блокировки в запросе, но у меня нет навыков, чтобы определить, какой тип блокировки использовать.

Процесс SQL таков: Получить текущее значение последовательности (й) в табличную переменную, Может быть запрос на более чем одну последовательность. Обновление значения последовательности в виде приращения. Возвращаемая переменная таблицы

Показанный код VB. Net предназначен для описания параллельного вызова. Я не думаю, что в код, который будет полезен для тех, кто смотрит на этот вопрос. Существует множество библиотек, и большинство из них относятся к моделям или вызовам к SQL, они ничем не примечательны и неизменны, поскольку их изменение не входит в сферу действия этого исправления.

    Parallel.Invoke(New ParallelOptions With {.MaxDegreeOfParallelism = 30},
    Sub()
            If logEmailValues.KnownEmailAddresses IsNot Nothing Then
                    Parallel.ForEach(logEmailValues.KnownEmailAddresses,
                            Function(ByVal knownEmail) As LogMailLogResponses
                                  Responses.LogResponses.AddRange(New 
                                         LogMailExistingCustomer(apiContect)
                                        .AddCommunicationForExistingContact(ret
                                        , repo
                                        , knownEmail
                                        , logEmailValues.EmailDetails
                                        , dataService, traceService).LogResponses)
                                Return Responses
                            End Function)
                        End If 
                    End Sub,
    Sub()
        If logEmailValues.UnknownEmailAddresses IsNot Nothing Then 
            Parallel.ForEach(logEmailValues.UnknownEmailAddresses,
                   Function(ByVal unknownEmail) As LogMailLogResponses
                           Responses.LogResponses.AddRange(New LogMailNewCustomer().AddCommunicationForNewContact(ret, repo, unknownEmail, logEmailValues.EmailDetails
                                , dataService, traceService).LogResponses)
                                Return Responses
                            End Function)
                        End If
                    End Sub)
Return Responses

Если есть предложение о VB.Code Я рад, что C# или VB будет дан, поскольку я работаю в обоих. Но в идеале, предложение о том, как улучшить SQL, было бы лучше всего, оно находится на стадии написания сегодня, так что это что-то вроде пустой проверки

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