У меня есть 2 экземпляра приложения VB.NET, каждое из которых работает на своих собственных выделенных серверах.Указанное приложение запускает цикл While true с 5-секундным сном на IDLE (IDLE - это когда в таблице нет обработанного ProcessQuery).На каждой итерации приложение ставит под сомнение таблицу в базе данных SQL, чтобы узнать, может ли она что-либо обработать.
Проблема в том, что я иногда сталкиваюсь с проблемой, когда оба экземпляра "берут" один и тот же ProcessQuery.
Я использую EntityFramework6.Я посмотрел в EntityState, но я не думаю, что он делает именно то, что я пытаюсь достичь.
Мне было интересно, каким было бы мое решение для создания идеальных параллельных экземпляров.Это не невозможно в какой-то момент у меня 12 экземпляров, работающих на 12 машинах.
Спасибо!
Dim conn As New Info_IndusEntities()
Dim DemandeWilma As WilmaDemandes = conn.WilmaDemandes.Where(Function(x) x.Site = 'LONDON' AndAlso x.Statut = 'toProcess').OrderBy(Function(x) x.RequestDate).FirstOrDefault
If Not IsNothing(DemandeWilma) Then
DemandeWilma.Statut = Statuts.EnTraitement.ToString
DemandeWilma.ServerName = Environment.MachineName
DemandeWilma.ProcessDate = DateTime.Now
conn.SaveChanges()
Return DemandeWilma
end if
ОБНОВЛЕНИЕ (21/06/19)
Я нашел статья что я нахожу интересным.
Я начал с добавления столбца в мою таблицу:
ОБНОВЛЕНО (21/06/19)
Затем я обновил свою модель и изменил свойство Проверка параллелизма столбца RowVersion в моем ORM:
Когда я тестировалобновите, вот журнал EF6:
ОБНОВЛЕНИЕ [dbo]. [WilmaDemandes] SET [Statut] = @ 0, [ServerName] = @ 1, [DateDebut] = @ 2 WHERE (([ID] = @ 3) И ([RowVersion] = @ 4)) ВЫБРАТЬ [RowVersion] ОТ [dbo]. [WilmaDemandes] ГДЕ @@ ROWCOUNT> 0 И [ID] = @ 3
- @0: «EnTraitement» (тип = строка, размер = 20)
- @ 1: «TRB5995» (тип = строка, размер = 20)
- @ 2: '2019-06-25 7:31:01 AM '(Type = DateTime2)
- @ 3:' 124373 '(Type = Int32)
- @ 4:' System.Byte[] '(Тип = Двоичный, Размер = 8)
- Выполнено в 2019-06-25 7:31:24 AM -04: 00
- Завершено за 95 мс срезультат: SqlDataReader
Закрытое соединениеt 2019-06-25 7:31:24 AM -04: 00
Возникло исключение: 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' в EntityFramework.dll
ОБНОВЛЕНО (25/06/19)
Проблемы, описанные в в этом посте , начинаются, когда вы используете DB-First вместо Code-First.Ваша собственность будет перезаписана без вывода сообщений , как только вы обновите модель.Некоторые люди тогда закодировали обходной путь консольного приложения, которое они запускают перед сборкой.Я не уверен, что я вполне готов принять это решение как окончательное решение.
Интересное руководство о том, как тестировать оптимистичный параллелизм и способы устранения такого исключения.