|
Блокировка таблицы разными хранимыми процедурами
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые. ASA 9.0.2.3486. Есть таблица: Код: sql 1. 2. 3. 4. 5. 6.
В ней 2 поля-признака для 2-х процедур: proc1 = 1 когда процедура _proc1 выполняется, proc2 = 1 когда процедура _proc2 выполняется. Вот сами процедуры: Код: 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. 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.
Мессаджи специально прописал, чтобы было видно ход выполнения процедур. В одном Interactive SQL вызываю: Код: sql 1.
В другом Interactive SQL вызываю: Код: sql 1.
Если почти одновременно запустить процедуры, то видно, что та процедура, которая первой успела проапдейтить таблицу, блокирует ее, и вторая процедура вынуждена ждать завершения первой. Подскажите как этой блокировки избежать ? Хотелось бы, чтобы процедуры выполнялись параллельно, не мешая дру другу. Не хотелось бы для каждой процедуры создавать отдельную таблицу. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 18:45 |
|
Блокировка таблицы разными хранимыми процедурами
|
|||
---|---|---|---|
#18+
Сделай не два поля в одной записи, а по одной записи на процедуру. Код: sql 1. 2. 3. 4.
Читай тут: http://infocenter.sybase.com/help/topic/com.sybase.help.sqlanywhere.12.0.0/dbusage/update-how-transact.html ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 19:15 |
|
Блокировка таблицы разными хранимыми процедурами
|
|||
---|---|---|---|
#18+
White OwlСделай не два поля в одной записи, а по одной записи на процедуру. Код: sql 1. 2. 3. 4.
Читай тут: http://infocenter.sybase.com/help/topic/com.sybase.help.sqlanywhere.12.0.0/dbusage/update-how-transact.html К сожалению структуру таблицы нельзя менять. Там должна быть одна запись с полями для многих процедур. Хотя идея хранить флаг для каждой процедуры в разных записях решило бы проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2013, 12:05 |
|
Блокировка таблицы разными хранимыми процедурами
|
|||
---|---|---|---|
#18+
Пробовал прописывать явно коммиты после апдейта записи в процедурах. Код: 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. 28. 29.
Код: 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. 28. 29.
При этом сообщения сервера такие: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Из чего видно: 1) _proc1 запустилась 2) _proc1 пометило запись в таблице, что она запущена, и стала выполнять свой цикл 3) _proc2 запустилась 4) _proc2 пометило запись в таблице, что она запущена, и стала выполнять свой цикл 5) _proc1 выполнило свой цикл и пометило запись в таблице, что она закончила работу, и завершилась 6) _proc2 выполнило свой цикл и пометило запись в таблице, что она закончила работу, и завершилась При этом время выполнения каждой из процедур 30-31 сек, как пишет интерактив в execution time. Если коммиты в процедурах закомментировать и выполнить еще раз, то сообщения сервера такие: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Из чего видно: 1) _proc1 запустилась 2) _proc1 пометило запись в таблице, что она запущена, и стала выполнять свой цикл 3) _proc2 запустилась и готова пометить запись в таблице, что она запущена, но ждет пока таблицу отпустит _proc1 5) _proc1 выполнило свой цикл и пометило запись в таблице, что она закончила работу 6) _proc2 пометило запись в таблице, что она запущена, и стала выполнять свой цикл 7) _proc1 завершилась 8) _proc2 выполнило свой цикл и пометило запись в таблице, что она закончила работу, и завершилась При этом время выполнения каждой из процедур уже около минуты, как пишет интерактив в execution time. Можно ли вот так явно прописывать COMMIT в процедурах, чтобы избавиться от блокирования таблицы и не всплывут ли из-за этого подводные камни и потенциальные ошибки ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2013, 12:29 |
|
Блокировка таблицы разными хранимыми процедурами
|
|||
---|---|---|---|
#18+
lioner, Ваш последнее сообщение надо понимать так - "я понимаю, что у меня сделано не так, но переделывать не хочу, хочу чтобы и так все заработало" Чудес не бывает. Минимально блокировка на уровне записи идет, уровень столбца достичь сложновато. Не трогайте существующую таблицу, пусть живет. Создайте новую таблицу как Вам посоветовали и перепишите процедуры. Для установки и сброса флага выполнения процедур лучше написать отдельную процедуру и использовать ее единообразно в Ваших процедурах. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2013, 12:35 |
|
|
start [/forum/topic.php?fid=55&fpage=11&tid=2009958]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 219ms |
total: | 382ms |
0 / 0 |