|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
Пишу программу на Delphi с использованием компонентов доступа к БД UniDAC 3.60.16 Ситуация следующая - запись в БД производится через хранимые процедуры (ХП) следующим алгоритмом: 1. ХП для записи в БД вызываются одним компонентом spProcedure (TUniStoredProc - аналог стандартного TStoredProc) последовательно 2. spProcedure имеет свой компонент транзакций trSP (TUniTransaction тоже аналог стандартного) 3. Сначала стартую его транзакцию trSP.Transaction.StartTransaction 4. Настраиваю параметры подготовленной ХП 5. Пытаюсь вызвать ХП spProcedure.ExecProc 6. Получаю сообщение об ошибке: [Sybase][ODBC Driver][Adaptive Server Enterprise]Stored procedure 'spAddDelDocument' may be run only in unchained transaction mode. The 'SET CHAINED OFF' command will cause the current session to use unchained transaction mode. Если транзакцию не стартовать или ХП 'spAddDelDocument' вызывать из под iSQL - ошибки нет. Вот код ХП: Код: 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.
Предполагаю, что где то недонастроил сам сервер или БД, но вот где ? Подскажите пжлста в какую сторону копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 13:22 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
On 22.04.2011 14:22, lolo-soft wrote: > 6. Получаю сообщение об ошибке: [Sybase][ODBC Driver][Adaptive Server > Enterprise]Stored procedure 'spAddDelDocument' may be run only in unchained > transaction mode. The 'SET CHAINED OFF' command will cause the current session > to use unchained transaction mode. В ASE есть два режима работы транзакций ( как и во многих других СУБД). chained transaction mode (или autocommit = off) unchained transaction mode (DEFAULT) (или autocommit = on) Переключается режим с помощью set chained on|off Каждая хранимая процедура потенциально может работать либо только в одном из этих режимов, либо в обоих. Всего возможно три варианта. Вот эти варианты храняться в метаданных о процедуре в БД, и при вызове процедуры проверяется, что она МОЖЕТ работать в текущем режиме работы транзакций. Иначе она не вызывается, поскольку может быть рассогласованное управление транзакциями и порча данных. При создании процедуры она 'запоминает' тот режим работы с транзакциями, при котором она была создана, как единственно возможный для неё. Если для процедуры допустима работа и в другом режиме работы с транзакциями, то нужно явно проставить режимы работы для процедуры с помощью вызова сиситемной хранимой процедуры sp_procxmode http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36273.1550/html/sprocs/X10690.htm Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 14:33 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
lolo-softЕсли транзакцию не стартовать Вручную транзакцию стартовать не надо никогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 17:42 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
White OwlВручную транзакцию стартовать не надо никогда. А как тогда быть, если мне нужно запись в несколько таблиц выполнить как "единое целое". Без "ручного управления" транзакциями это врядли осуществимо. Это он пошутил. Имеется в виду, что если у тебя chained mode транзакция начнётся сама при начале выполнения первого DML. Но у тебя вызов API-функции, не факт что он внутри реально будет транзакцию стартовать. Ну и даже если так, ничего страшного не будет всё равно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2011, 05:19 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
lolo-softИмеется в виду, что если у тебя chained mode транзакция начнётся сама при начале выполнения первого DML.Неверно. Транзакция стартует в любом режиме. Разница между режимами как в раз в том как будет вести себя сервер при получении команды на открытие новой транзакции. lolo-softНо у тебя вызов API-функции, не факт что он внутри реально будет транзакцию стартовать. Ну и даже если так, ничего страшного не будет всё равно.И чем по твоему вызов API функции отличается от "обычной" команды? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2011, 20:07 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
On 23.04.2011 21:07, White Owl wrote: > И чем по твоему вызов API функции отличается от "обычной" команды? Он может знать, что работает в chained и не начинать реально транзакцию. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2011, 20:33 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
MasterZivOn 23.04.2011 21:07, White Owl wrote: > И чем по твоему вызов API функции отличается от "обычной" команды? Он может знать, что работает в chained и не начинать реально транзакцию. Кто может знать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2011, 01:00 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
MasterZivОн может знать, что работает в chained и не начинать реально транзакцию. Поэтому, видимо, он и вываливается с ошибкой. Что я пытаюсь начать транзакцию, а сервер "не дает", т.к. знает что ХП сама запустит транзакцию и сама ее подтвердит/отменит. Как тогда создавать ХП, чтобы они изначально стартовали не в CHAINED режиме ? Или же это нужно устанавливать после каждого создания ХП через sp_procxmode ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2011, 04:45 |
|
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
|
|||
---|---|---|---|
#18+
On 24.04.2011 5:45, lolo-soft wrote: > Он может знать, что работает в chained и не начинать реально транзакцию. "ОН" -- это вызываемый API, функция которого зовётся. > Поэтому, видимо, он и вываливается с ошибкой. Что я пытаюсь начать транзакцию, а > сервер "не дает", т.к. знает что ХП сама запустит транзакцию и сама ее > подтвердит/отменит. Нет. Транзакция в процедуре и вне процедуры никак друг на друга не влияют. Если транзакция уже начата, процедура её продолжает. Если нет - -начинает свою. > Как тогда создавать ХП, чтобы они изначально стартовали не в CHAINED режиме ? Создавать её в CHAINED режиме. Хотя я не знаю, не пробовал никогда. > Или же это нужно устанавливать после каждого создания ХП через *sp_procxmode* ? Да. Надо устанавливать. Лучше всего это как раз и делать -- после создания в явном виде задать режим работы через sp_procxmode. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2011, 10:29 |
|
|
start [/forum/topic.php?fid=55&msg=37228776&tid=2010347]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 160ms |
0 / 0 |