|
Обработка конкурентного доступа (StaleObjectStateException) в БД используя NHibernate
|
|||
---|---|---|---|
#18+
Добрый день! Ищю совета как правильно обработать ситуацию конкурентного доступа к записи в БД двумя пользователями при использовании в качестве посредника NHibernate для работы с БД. Есть таблица в БД MSSQL Server-e 2005 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Для обнаружения конфликта при параллельном доспупе к записи в таблице БД использую optimistic-lock="version" в маппинге и соответственно такое же поле в объекте Customer. Сессия NHibernate в проекте используется одна долгоживущяя для всех форм (объектов). По адрессу http://msdn.microsoft.com/ru-ru/magazine/ee819139.aspx на русском http://msdn.microsoft.com/en-us/magazine/ee819139.aspx на английском нашел пример обрабоки ситуации при возникновении конфликта при параллельном изменениии записи двумя пользователями, так вот там рекомендуется если нужно при конфликте просто сохранить в БД свою версию записи, то нужно всего навсего получить текущее значение поля Version из таблицы БД и присвоить его своему объекту и далее сохранить уже свой объект в БД. Правда в примере для сохранения изменений в объекте используется отдельная сессия NHibernate. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Все вроде бы работает, но в БД записываются нужные измениния с правильном зачением поля Version, а в объекте customer поле Version имет старое значение. Код: plaintext 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.
Теперь если после обработки исключения StaleObjectStateException и принятия решения сохранить свою версию в БД, пользователь через некоторое время вновь сделает изменения в этом объекте и решит сохранить их в БД (второй пользователь ничего не изменял) то опять будет сгенерировано исключение StaleObjectStateException, т.к. в объекте было одно значение в поле Version, а в таблице БД другое. В общем интересует мнение знающих как правильно разрулить эту ситуацию или вообще как правильно обрабатывать ситуацию с конкурентным доступом. Да, методы Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2011, 15:34 |
|
Обработка конкурентного доступа (StaleObjectStateException) в БД используя NHibernate
|
|||
---|---|---|---|
#18+
midavik, Не знаю, как вы там обрабатываете исключение, но вкратце правила таковы: 1. После возникновения StaleObjectStateException сессия переходит в неопределённое состояние, и в ответ на любые действия будет кидаться исключениями. 2. Merge сливает изменения из вашего объекта из дохлой сессии, в объект загруженный в рамках новой сессии. После этого объект загруженный в дохлой сессии использовать нельзя, а использовать свежезагруженный и смерженный. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2011, 11:50 |
|
|
start [/forum/topic.php?fid=17&tid=1350588]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 142ms |
0 / 0 |