|
зацикливание в курсоре
|
|||
---|---|---|---|
#18+
Добрый день. Есть кусок кода, который нормально отрабатывает на MS SQL и со второго раза на SYBASE. С первого раза этот кусок кода на SYBASE сваливается в вечный цикл и делает вечный update таблицы tResArrest Подскажите пожалуйста в чем может быть проблема? Вот проблемный код: Код: 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.
Возможно, с синтаксисом немножко напортачил, извиняюсь, но суть запроса такая. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2010, 20:57 |
|
зацикливание в курсоре
|
|||
---|---|---|---|
#18+
Не существует базы SYBASE. Читай первый топик форума. Не используй управление транзакциями внутри процедуры. Читай в BOL главу Nested transactions Что такое "первый раз" который не работает и "второй раз" который работает? Если один запуск процедуры отличается от второго запуска значит первый что-то изменил в каких-то затрагиваемых таблицах. Сделай дамп всех своих таблиц между запусками и ищи разницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2010, 21:23 |
|
зацикливание в курсоре
|
|||
---|---|---|---|
#18+
White Owl, что значит - не использовать транзакции внутри процедуры? а где же тогда их использовать!? в BOL написано про системные процедуры, может быть Вы это имели ввиду? А по поводу того, что первый запрос что-то изменил в БД, так это только поле RestCheckID, к-рый курсор апдейтит в "вечном" цикле. При этом на каком-то этапе я отрубаю этот "долгоиграющий" процесс и в таблице остаются (как и было до курсора) 3 записи, только ID уже другие. А когда запускаю этот запрос второй раз на этой же базе, то запрос отрабатывает быстро и без рекурсий. Нарыл в BOL'е еще инфу про Halloween problem. Может здесь ключ к разгадке? Т.е. хинтом попробовать задать определенный индекс, к-рый обеспечит table scan. Или я что-то опять важное упустил? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2010, 00:26 |
|
зацикливание в курсоре
|
|||
---|---|---|---|
#18+
NikYarik84White Owl, что значит - не использовать транзакции внутри процедуры? а где же тогда их использовать!? На клиенте и только на клиенте. А по хорошему вообще не использовать. Убери к чертовой матери begin tran и сопуствующий commit. Для того что ты делаешь одного save tran c rollback хватит. NikYarik84А по поводу того, что первый запрос что-то изменил в БД, так это только поле RestCheckID, к-рый курсор апдейтит в "вечном" цикле. При этом на каком-то этапе я отрубаю этот "долгоиграющий" процесс и в таблице остаются (как и было до курсора) 3 записи, только ID уже другие. А когда запускаю этот запрос второй раз на этой же базе, то запрос отрабатывает быстро и без рекурсий. Еще раз повторяю: если второй запуск отрабатывает не так как первый, значит первый что-то изменил в состоянии базы. Третий запуск работает? А четвертый? А пятый? А вообще, смотрю я на этот код и слегка недоумеваю, а для чего это все??? Пронумеровать строки? Это проще делать на клиенте. Создать уникальный ИД для записи? Так автоинкрементное поле быстрее работать будет. В конце-концов, если хочется развлекаться с курсорами, то в данном случае будет намного лучше делать курсор for update и обновлять его. И еще раз: БАЗА КАКАЯ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2010, 02:19 |
|
|
start [/forum/topic.php?fid=55&msg=36945837&tid=2010477]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 472ms |
0 / 0 |