|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Есть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework. Экземпляры контекста создаются новые - каждый в своем потоке. Почему обращения к БД становятся в очередь? Кто-нибудь сталкивался с такой проблемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 14:15 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
ProgED, Читаете/пишете? Что за БД? Кусок схемы данных? Лог трассировки запросов и параметров, которые сыплются в БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 14:35 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Когда ты вызываешь ctx.SaveChanges(), то происходит примерно то, что под spoiler'ом. Например таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 15:58 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Криво вставилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 16:00 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
сперва в голове всплыло.. что гдето попадалась информация... что ADO в один момент времени выполняет один запрос.. но не тут-то было ради любопытства накидал, форма с двумя баттонами, два запроса, первый очень долгий Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
результат теста - пока выполняется первый, без проблем вызывается второй вывод.. ADO.Net справляется с одновременными запросами из разных потоков потом попробовал такой вот вариант Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
квери ту заткнулся пока не выполнился квери уан ) для паралельных запросов нужны разные connection такой вот эксперимент ) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 17:09 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Кифирчик, Экземплярные члены SqlConnection не потокобозопасены. Сам SqlConnection представляет собой соединение с базой, потому команды в пределах разных Connection отсылаются к БД независимо. Эти запросы из примера не конкурируют за ресурсы. Код: sql 1.
Код: sql 1.
У автора, скорее всего конкуренция писателей или писателей/читателей на уровне БД (автор найдет ответ при чтении transactions, isolation levels, blocking/versioning mode и т. п..). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 17:35 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Lord British, Возможно, я привел пример для "информации". И он показывает, что если в разных потоках юзается один Connection то запросы встанут в очередь. Факт. Не использую Entity FrameWork, и не знаю его внутренностей, по этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО. авторУ автора, скорее всего конкуренция писателей или писателей/читателей на уровне БД (автор найдет ответ при чтении transactions, isolation levels, blocking/versioning mode и т. п..). Возможно, но я сильно сомневаюсь что у автора эта проблема на продакшене всплыла, с.. этак сотней пользователей, и кто-то что-то там залочил. Скорей всего запускает на "машине девелопера", 1..2 коннекта... в таком случае попасться на блокировку ресурсов... надо очень много граблей разложить )))) Хотя опять же, не знаю, возможно они уже разложены c помощью Entity и автор не учел извилистого пути между создавая программу) ИМХО ) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 18:06 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Кифирчик, КифирчикВозможно, я привел пример для "информации". И он показывает, что если в разных потоках юзается один Connection то запросы встанут в очередь. Нельзя этого делать - не потокобезопасно. Кифирчикпо этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО. У автора ProgEDЕсть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework. Экземпляры контекста создаются новые - каждый в своем потоке. Можешь считать, что по отдельному SqlConnection на каждый поток. Кифирчикпо этому не буду настаивать что причина 100% в этом, но такая вероятность есть. ИМХО. Потому такой вероятности нет. Совсем нет. КифирчикНе использую Entity FrameWork, и не знаю его внутренностей В дебрях EF это выглядит так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
Эта проблема вполне вероятна при ProgEDЕсть приложение, которое в нескольких потоках обращается к одной БД MS SQL с помощью Entity Framework. Решение этой проблемы - как минимум, понимание транзакций, уровня изоляций и т. п.. а также правильное проектирование схемы и логики прилодения, чтобы потоки не мешали друг другу. Иначе смысла в них нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 19:05 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Кифирчик, Сессия 1 Код: sql 1. 2. 3. 4. 5.
Сессия 2 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 19:24 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
почему кстати не запустить профайлер или мониторинг и не посмотреть почему висит? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 19:58 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
netivanпочему кстати не запустить профайлер или мониторинг и не посмотреть почему висит? это мне вопрос? так я знаю почему висит, так СУБД реализует выбранный мной уровень изоляции транзакций при выбранной стратегии поведения блокировочник/версионник. cпециально подобрал примеры, которые скорее всего у автора темы повторяются в его приложении. из-за чего ему и кажется, что ProgEDПочему обращения к БД становятся в очередь? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 20:41 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 20:53 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Ок! Проблема скорей всего во взаимоблокировках.. ждемс профайлинга и красивого скрина с блокировками от топик стартера ) авторВ дебрях EF это выглядит так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Я правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 21:18 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями? КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями? DbContext реализует принцип UnitOfWork. Все изменения сделанные в пределах контекста при вызове SaveChanges отправляются в БД в пределах одной транзакции. Не обязательно взаимосвязанные сущности. EF тут поступает правильно. Другое дело, что его, вероятно, использовали там где не стоит. Подозреваю, у автора что-то типа обработки Entities пачками в потоках с длинными транзакциями и эскалациями блокировок. В итоге картина вроде такой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Сессия 1 (обновляем все записи с четным ID в пределах одной транзакции) Код: sql 1. 2. 3. 4. 5. 6. 7.
Сессия 2 (по идее не конфликтует с сессией 1 см. where, но из-за эскалации блокировок конфликтует) Код: sql 1. 2. 3. 4. 5. 6. 7.
Сессия 3 (какое-нбудь приложение, по той же причине что и сессия 2 ждет освобождения блокировки) Код: sql 1. 2. 3. 4. 5.
Сессия 4 (у меня настроенно, как версионник, потому нет конфликтов, у блокировочников будет ждать как и все остальные сессии, не зависимо пересекаются ли наборы в предикатах с сессией 1) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 22:11 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Lord BritishКифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями? КифирчикЯ правильно понял, что если в Entity сохранять взаимозависимые записи, он нагородит такое вот с транзакциями? DbContext реализует принцип UnitOfWork. Все изменения сделанные в пределах контекста при вызове SaveChanges отправляются в БД в пределах одной транзакции. Не обязательно взаимосвязанные сущности. EF тут поступает правильно. Другое дело, что его, вероятно, использовали там где не стоит. он создает явную транзакцию? надо бы посмотреть :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 15:47 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
netivan, Если есть Ambient транзакция, то если Enlist в connectionString'e true, учавствует в ней, если false то создает свою. Если Ambient нету, то создаст свою. Логично и предсказуемо. Иначе EF был бы бесполезен совсем. Пруфы: ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 18:38 |
|
Многопоточность и Entity Framework - почему возникают очереди?
|
|||
---|---|---|---|
#18+
Если кому интересно, как в описанной для MS SQL (когда он делает эскалацию) ситуации поведет Oracle. В Oracle эскалации блокировок нет. The standard level of locking in an Oracle database guarantees the highest possible level of concurrency. This means that if a session is updating one row, the one row is locked; nothing else. Furthermore, the row is only locked to prevent other sessions from updating it—other sessions can read it at any time. The lock is held until the transaction completes, either with a COMMIT or a ROLLBACK. Заполняем данными Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Сессия 1 (не блокирует сессию 2) Код: sql 1. 2. 3. 4. 5.
Сессия 2 (не блокирует сессию 1) Код: sql 1. 2. 3. 4. 5.
В Oracle нет эскалации блокировок в отличие от MS SQL. To execute DML on rows, a session must acquire exclusive locks on the rows to be changed, and shared locks on the tables containing the rows. If another session already has exclusive locks on the rows, the session will hang until the locks are released by a COMMIT or a ROLLBACK. If another session already has a shared lock on the table and exclusive locks on other rows, that is not a problem. An exclusive lock on the table would be, but the default locking mechanism does not lock whole tables unless this is necessary for DDL statements. "SPID""ORA""VLOCK""TYPE""LMODE""WAIT""5048""SCOTT""AE""AE""S""""5048""SCOTT""TRANSACTION ROW-LEVEL""DML LOCK""X""""4564""SCOTT""AE""AE""S""""4564""SCOTT""TRANSACTION ROW-LEVEL""DML LOCK""X""" Две сессии захватили shared блокировку на таблицу и эксклюзивные на свои строки. Никто никому не мешает. Для Oracle блокировка не ресурс в понимании MS SQL в силу различия реализации. MS SQL делает эскалацию не от хорошей жизни, а Oracle можно сказать все равно в данной ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 22:06 |
|
|
start [/forum/topic.php?fid=17&fpage=28&tid=1350124]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 143ms |
0 / 0 |