powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
9 сообщений из 9, страница 1 из 1
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37228545
lolo-soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу программу на 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.
create procedure spAddDelDocument(
    @Mode       int,
    @ID         int,
    @UserID     int,
    @ExecManID  int,
    @TypeID     smallint,
    @NewOwnerID int,
    @DateDoc    datetime
) as
declare @ActionName varchar( 255 )
declare @Subject    varchar( 255 )
declare @Params     varchar( 1024 )
begin
    select @Subject = 'LIST_DOCUMENTS'
    select @Params =  'TypeID = ' || convert(varchar( 15 ), @TypeID) || 
                      ';  UserID = ' || convert(varchar( 15 ), @UserID) ||     
                      ';  ExecManID = ' || convert(varchar( 15 ), @ExecManID) ||     
                      ';  NewOwnerID = ' || convert(varchar( 15 ), @NewOwnerID) || 
                      ';  DateDoc = ' || convert(varchar( 255 ), @DateDoc,  104 )
    if @Mode =  1  begin
        -- добавить новый документ
        if (@TypeID is not null) and (@DateDoc is not null) and (@UserID is not null) begin
            insert into LIST_DOCUMENTS(TYPE_ID, NEW_OWNER_ID, DATE_DOC, USER_ID, IS_ACTIVE, EXEC_MAN_ID)
            values (@TypeID, @NewOwnerID, @DateDoc, @UserID,  1 , @ExecManID)
        
            select @ID = @@IDENTITY
            
            select @ActionName = 'Добавлен документ'
            execute spAddLogLine @ActionName, @UserID, @Subject, @Params, null, @ID
        
            return @ID
        end else begin
            select @ActionName = 'Ошибка создания документа. Не все параметры'
            execute spAddLogLine @ActionName, @UserID, @Subject, @Params, null, null
            return - 1 
        end
    end else 
    if @Mode =  3  begin
        -- удалить ссылки на документ
        delete from EQUIP_CHANGE_VALUES
        where DOC_ID = @ID
        
        delete from DOCS_LINES
        where DOC_ID = @ID
        -- удалить существующий документ
        delete from LIST_DOCUMENTS
        where ID = @ID
        
        select @ActionName = 'Удален документ'
        execute spAddLogLine @ActionName, @UserID, @Subject, @Params, null, @ID
        
        return  0 
    end
end

Предполагаю, что где то недонастроил сам сервер или БД, но вот где ?
Подскажите пжлста в какую сторону копать.
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37228776
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37229365
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lolo-softЕсли транзакцию не стартовать
Вручную транзакцию стартовать не надо никогда.
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37229956
lolo-soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВручную транзакцию стартовать не надо никогда.
А как тогда быть, если мне нужно запись в несколько таблиц выполнить как "единое целое". Без "ручного управления" транзакциями это врядли осуществимо.

Это он пошутил.

Имеется в виду, что если у тебя chained mode транзакция начнётся сама при начале выполнения первого DML.
Но у тебя вызов API-функции, не факт что он внутри реально будет транзакцию стартовать.
Ну и даже если так, ничего страшного не будет всё равно.
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37230365
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lolo-softИмеется в виду, что если у тебя chained mode транзакция начнётся сама при начале выполнения первого DML.Неверно. Транзакция стартует в любом режиме. Разница между режимами как в раз в том как будет вести себя сервер при получении команды на открытие новой транзакции.

lolo-softНо у тебя вызов API-функции, не факт что он внутри реально будет транзакцию стартовать.
Ну и даже если так, ничего страшного не будет всё равно.И чем по твоему вызов API функции отличается от "обычной" команды?
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37230373
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 23.04.2011 21:07, White Owl wrote:
> И чем по твоему вызов API функции отличается от "обычной" команды?

Он может знать, что работает в chained и не начинать реально транзакцию.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37230546
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 23.04.2011 21:07, White Owl wrote:
> И чем по твоему вызов API функции отличается от "обычной" команды?

Он может знать, что работает в chained и не начинать реально транзакцию.
Кто может знать?
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37230603
lolo-soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivОн может знать, что работает в chained и не начинать реально транзакцию.
Поэтому, видимо, он и вываливается с ошибкой. Что я пытаюсь начать транзакцию, а сервер "не дает", т.к. знает что ХП сама запустит транзакцию и сама ее подтвердит/отменит.

Как тогда создавать ХП, чтобы они изначально стартовали не в CHAINED режиме ? Или же это нужно устанавливать после каждого создания ХП через sp_procxmode ?
...
Рейтинг: 0 / 0
Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
    #37230638
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 24.04.2011 5:45, lolo-soft wrote:

> Он может знать, что работает в chained и не начинать реально транзакцию.

"ОН" -- это вызываемый API, функция которого зовётся.

> Поэтому, видимо, он и вываливается с ошибкой. Что я пытаюсь начать транзакцию, а
> сервер "не дает", т.к. знает что ХП сама запустит транзакцию и сама ее
> подтвердит/отменит.

Нет. Транзакция в процедуре и вне процедуры никак друг на друга не
влияют. Если транзакция уже начата, процедура её продолжает. Если
нет - -начинает свою.


> Как тогда создавать ХП, чтобы они изначально стартовали не в CHAINED режиме ?

Создавать её в CHAINED режиме. Хотя я не знаю, не пробовал никогда.

> Или же это нужно устанавливать после каждого создания ХП через *sp_procxmode* ?

Да. Надо устанавливать. Лучше всего это как раз и делать -- после создания
в явном виде задать режим работы через sp_procxmode.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вызов хранимой в транзакции, которую стартовали вручную (ASE 12.5 + UniDAC + DelphiXE)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]