|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
Можно ли использовать транзакции во внешней базе данных, используя %SQLGatewayConnection? Поясню. Есть следующий код: S Connection=##class(%SQLGatewayConnection).%New() S RET=Connection.Connect(DSN,USER,PASSWORD) S RET=Connection.AllocateStatement(.Statment) S SQLString="INSERT INTO MYTABLE (F1 , F2) VALUES (? , ?)" ... заполнение Param S RET=Connection.BindParameters(Statment,Param(1),Param(2),Param(3),Param(4),Param(5)) S RET=Connection.SetParameter(Statment,$LB(V1),1) S RET=Connection.SetParameter(Statment,$LB(V2),2) S RET=Connection.Prepare(Statment,SQLString) S RET=Connection.Execute(Statment) Set RET=Connection.DropStatement(Statment) D Connection.Disconnect() Так вот. Хочу между Connection.Connect(DSN,USER,PASSWORD) и Connection.Disconnect() иметь возможность делать мнежество операций по модификации данных, причем, с возможностью в любой момент сказать внешней базе данных ROLLBACK. В качестве внешней базы используется oracle ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2007, 11:38 |
|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
По идее в этом классе есть method Transact(type) returns %Status Method Transact( type) invokes SQLEndTran. Pass 0 for SQL_COMMIT and 1 for SQL_ROLLBACK. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2007, 12:05 |
|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
ну яПо идее в этом классе есть method Transact(type) returns %Status Method Transact( type) invokes SQLEndTran. Pass 0 for SQL_COMMIT and 1 for SQL_ROLLBACK. По идее есть. Но не работает.. Делаю D Connection.Transact(1) ошибок не дает, но изменения закоммичены. С D Connection.Transact(0) результат аналогичен... Максимум что получается это организовать транзакцию в 1 Execute. S SQLString="BEGIN INSERT INTO MYTABLE (F1 , F2) VALUES (? , ?); ROLLBACK; END;" и S SQLString="BEGIN INSERT INTO MYTABLE (F1 , F2) VALUES (? , ?); COMMIT; END;" Такие конструкции работают, но большого смысла в них нет... Похоже, что после каждого Execute делается COMMIT... Хотя очень хочется иметь транзакцию... :( ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2007, 13:14 |
|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
Оракла под рукой нет, но судя по поведению включен автокоммит. Для ODBC это управляется через SQLSetConnectAttr, в SQLGateway ему соответствует SetConnectOption method SetConnectOption(opt, val) returns %Status Method SetConnectOption(opt, val) invokes SQLSetConnectAttr. Only integer values are supported. Integer values for the opt may be taken from sql.h and sqlext.h header files. Судя по заголовочным sql.h и sqlext.h #define SQL_AUTOCOMMIT 102 После коннекта я бы попробовал выставить d Connection.SetConnectOption(102,0) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2007, 13:39 |
|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
ну яно судя по поведению включен автокоммит ..... После коннекта я бы попробовал выставить d Connection.SetConnectOption(102,0) Действительно автокоммит! Все заработало. Большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2007, 13:50 |
|
%SQLGatewayConnection и транзакции
|
|||
---|---|---|---|
#18+
MaWr, подскажите пожалуйста ,а что будет если использовать ResultSet? что-то пробую вот все что описано, только почему то результат как у вас вначале? все комитится.пробую делать вконце несмотря ни на что RollBack но все равно все сохраняет? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 19:47 |
|
|
start [/forum/topic.php?fid=39&msg=34512627&tid=1556129]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 416ms |
0 / 0 |