и затем повторно SubmitChanges
НО! при этом реально в БД эти данные остаются старыми (как будто я никаких ResolveAll не вызывал и повторно не сабмитил)
2) По завершения работы дочерних потоков, в главном потоке меняю состояние результирующего объекта и делаю submit — исключений не возникает,
но после повторного запуска приложения получаю предпоследнее состояние результирующего объекта !! WTF !!!
Может кто сталкивался с многопоточностью в LINQ to SQL ?
Помогите советом.
O>База SQLite через "ADO.NET 3.5SP1 Entity Framework support for SQLite" O>В приложении есть объет базы содержаший DataContext
O>Может кто сталкивался с многопоточностью в LINQ to SQL ? O>Помогите советом.
У вас DataContext один на все потоки или разные? Я делал на каждый новый поток свой DataContext, у меня для 50 потоков примерно 5 параллельных подключений к sql висит в пуле. Но в таком случае при использовании OptimisticConcurrency возможны указанные ошибки, так как если одни и те же данные сначала были загружены несколькими потоками и потом были изменены, то все, кроме первого, получат отказ в применении изменений.
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Здравствуйте, Sshur, Вы писали:
S>У вас DataContext один на все потоки или разные? Я делал на каждый новый поток свой DataContext, у меня для 50 потоков примерно 5 параллельных подключений к sql висит в пуле. Но в таком случае при использовании OptimisticConcurrency возможны указанные ошибки, так как если одни и те же данные сначала были загружены несколькими потоками и потом были изменены, то все, кроме первого, получат отказ в применении изменений.
DataContext один на всех, обслуживают 2-3 потока.
В том то и дело, что каждый поток меняет данные, выданные ему из очереди.
Объект попасть в соседний поток не сможет.
Здравствуйте, Obukhov, Вы писали:
O>Здравствуйте, Sshur, Вы писали:
S>>У вас DataContext один на все потоки или разные? Я делал на каждый новый поток свой DataContext, у меня для 50 потоков примерно 5 параллельных подключений к sql висит в пуле. Но в таком случае при использовании OptimisticConcurrency возможны указанные ошибки, так как если одни и те же данные сначала были загружены несколькими потоками и потом были изменены, то все, кроме первого, получат отказ в применении изменений.
O>DataContext один на всех, обслуживают 2-3 потока.
O>В том то и дело, что каждый поток меняет данные, выданные ему из очереди. O>Объект попасть в соседний поток не сможет.
Что значит "выданные из очереди" ?
И вопрос, для вас важна OptimisticConcurrency или нет? Можно её просто отключить и проблем не будет. Но тогда изменения, сделанные одним потоком, могут быть потерты другими.
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Здравствуйте, Obukhov, Вы писали:
S>>У вас DataContext один на все потоки или разные? Я делал на каждый новый поток свой DataContext, у меня для 50 потоков примерно 5 параллельных подключений к sql висит в пуле. Но в таком случае при использовании OptimisticConcurrency возможны указанные ошибки, так как если одни и те же данные сначала были загружены несколькими потоками и потом были изменены, то все, кроме первого, получат отказ в применении изменений.
O>DataContext один на всех, обслуживают 2-3 потока.
Any instance members are not guaranteed to be thread safe.
Здравствуйте, Sshur, Вы писали:
S>Что значит "выданные из очереди" ?
S>И вопрос, для вас важна OptimisticConcurrency или нет? Можно её просто отключить и проблем не будет. Но тогда изменения, сделанные одним потоком, могут быть потерты другими.
Сделана очередь, которая выдаёт объекты из списка необработанных, по порядку, пока не закончится итератор.
OptimisticConcurrency мне подходит, и собственно делаю ResolveAll(RefreshMode.KeepCurrentValues); но именно эти Cyrrent values в Бд в итоге не попадают!
Здравствуйте, Obukhov, Вы писали:
O>DataContext один на всех, обслуживают 2-3 потока.
ССЗБ.
Правильное использование DataContext: создали, записали/прочитали, выбросили. Шарить его между потоками — извращение.