UniStoredProc и пишущие транзакции в Firebird - как правильно?

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

UniStoredProc и пишущие транзакции в Firebird - как правильно?

Сообщение Akella » Пт 05 июл 2019 11:50

Не пойму, как правильно указывать свойства для транзаций компоненты TUniStoredProc.
Есть несколько разных хранимок, т.е. есть только для чтения (селективные) и есть пишущие хранимки.

для создания UniStoredProc есть функция

Код: Выделить всё

// transR и transW - транзакции

//пишущая транзакция
  transW := TUniTransaction.Create(connNotify);
  transW.IsolationLevel := ilCustom;
  transW.DefaultConnection := connNotify;
  transW.SpecificOptions.Values['Params'] := 'write;nowait;rec_version;read_committed';

//читающая транзакция
  transR := TUniTransaction.Create(connNotify);
  transR.IsolationLevel := ilCustom;
  transR.DefaultConnection := connNotify;
  transR.SpecificOptions.Values['Params'] := 'read;nowait;rec_version;read_committed';
...
function CreateUniStoredProc(const name: string; isQuery: boolean = False): TUniStoredProc;
begin
  result := TUniStoredProc.Create(connNotify);
  result.Connection := connNotify;
  result.StoredProcName := name;
  result.Transaction := transR;
  result.UpdateTransaction := transW;
  result.PrepareSQL(isQuery);// False = not Query
end;
создаю TUniStoredProc:

Код: Выделить всё

// процедура осуществляет только чтение данных из БД
SP_GET_PARENT_REGION_DETAIL := CreateUniStoredProc('SP_GET_PARENT_REGION_DETAIL');

// процедура осуществляет чтение и запись
SP_TTELEGRAMMAILINGPARAM_INSPAR := CreateUniStoredProc('SP_TTELEGRAMMAILINGPARAM_INSPAR');
Внутри процедуры "SP_TTELEGRAMMAILINGPARAM_INSPAR" есть SQL-операторы Select и Insert.

Проблема в том, что на строке

Код: Выделить всё

SP_TTELEGRAMMAILINGPARAM_INSPAR.ExecSQL;
появляется ошибка, что выполняется запись данных в читающей транзакции:
Project raised exception class EIBCError with message 'attempted update during read-only transaction
At procedure 'SP_TTELEGRAMMAILINGPARAM_INSPAR' line: 12, col: 3'.
Так вот. Может вместо ExecSQL нужно какой-то другой метод дёргать, который затронет именно SP_TTELEGRAMMAILINGPARAM_INSPAR.UpdateTransaction?

Или же всё-таки придётся указывать в свойстве SP_TTELEGRAMMAILINGPARAM_INSPAR.Transaction пишущую транзакцию?
Как правильно?

Firebird 3
Delphi Tokyo
UniDAC 7.1.4

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: UniStoredProc и пишущие транзакции в Firebird - как правильно?

Сообщение ViktorV » Пт 05 июл 2019 14:04

При использовании метода TUniStoredProc.ExecSQL, используется транзакция, определенная в свойстве TUniQuery.Transaction, а не в свойстве TUniQuery.UpdateTransaction.
Если у вас останутся вопросы после ознакомления с нашим ответом - пожалуйста, составьте и вышлите нам, с помощью контактной формы https://www.devart.com/company/contactform.html, полный пример, демонстрирующий указанное вами поведение, включающий скрипты для создания и заполнения объектов БД, чтобы дать вам быстрый и полный ответ на ваш вопрос, .

Ответить