powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / COM+ транзакция
5 сообщений из 5, страница 1 из 1
COM+ транзакция
    #32449173
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
У меня вот какой вопрос

Создаю СОМ+ компонент (TransTest3.ClassTest3), который стучится к Firebird 1.0. (Конечно если Interbase/Firebird в принципе не поддерживает СОМ+ транзакции, тогда вопрос отпадает сам собой)

Код: 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.
Public Sub MakeOrder()

Dim con As ADODB.Connection

On Error GoTo err_handler

Set contx = GetObjectContext()
Set con = New ADODB.Connection
con.Provider =  "MSDASQL.1 "
con.ConnectionString =  "DSN=test_errors;User Id=sysdba;Password=masterkey" 
con.Open

'''' Два последовательных запроса 

con.Execute  "insert into err_tbl(errors) values('Test String')" 

con.Execute  "delete from test_tbl where id > 2 "


If Not contx Is Nothing Then contx.SetComplete

exit_handler:
  
  If Not (con Is Nothing) Then
    If con.State = adStateOpen Then con.Close
    Set con = Nothing
  End If
  
  Set contx = Nothing
  Exit Sub


err_handler:
 If Not contx Is Nothing Then contx.SetAbort
 Resume exit_handler

End Sub

'''MTSTransationMode - RequiresTransaction, Instancing - MultiUse


Вызываю этот компонент на странице ASP

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<%@ LANGUAGE=VBScript TRANSACTION=Required %>

<%

  set tst=server.createobject( "TransTest3.ClassTest3" )
  tst.MakeOrder
  set tst=nothing
  
  
  Sub OnTransactionCommit
    response.write( "Transaction commited" )
  end sub

Sub OnTransactionAbort
  response.write( "Transaction aborted" )
end sub

%>


В компоненте в запросе "delete from test_tbl where id > 2" id - заведомо несуществующее поле. По логике, на выходе страницы должно быть "Transaction aborted". Так оно и есть. Однако не происходит отката первого запроса "insert into err_tbl(errors) values('Test String')" - изменения фиксируются.
В чем здесь загвоздка?
Зараннее благодарен
...
Рейтинг: 0 / 0
COM+ транзакция
    #32449247
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно не знаю, предполагаю, что
1)первый запрос
1.1 начинается трансзакция
1.2 выполняется insert into err_tbl(errors) values('Test String')
1.3 трансзакция завершается
2) второй запрос
2.1начинается трансзакция
2.2 выполняется delete from test_tbl where id > 2
2.3 ошибка
2.3 трансзакция откатывается
...
Рейтинг: 0 / 0
COM+ транзакция
    #32449371
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так:

Public Sub MakeOrder()
Dim con As ADODB.Connection

On Error GoTo err_handler

GetObjectContext.SetAbort

Set con = New ADODB.Connection
con.Provider = "MSDASQL.1"
con.ConnectionString = "DSN=test_errors;User Id=sysdba;Password=masterkey"
con.Open

'''' Два последовательных запроса
con.Execute "insert into err_tbl(errors) values('Test String')"
con.Execute "delete from test_tbl where id > 2"
getobjectcontexst exit_handler:
If Not (con Is Nothing) Then
If con.State = adStateOpen Then con.Close
Set con = Nothing
End If

GetObjectContext.SetCompete

Exit Sub
err_handler:

End Sub
...
Рейтинг: 0 / 0
COM+ транзакция
    #32449600
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
2 Green2:
Это очевидно. Вопрос в том, почему два запроса в транзакционном компоненте не выполняются в рамках единой транзакции.
...Вообще предполагаю, что это из-за особенностей реализации транзакций в интербейсе... Но хотелось бы знать наверняка.

2 Antonariy:
1)Зачем вызывать метод SetAbort до того, как вообще что-либо сделано?
2) авторgetobjectcontexst exit_handler: - ??
...
Рейтинг: 0 / 0
COM+ транзакция
    #32449905
Alex_2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще как единую транзакцию это можно сделать с помощью методов BeginTrans, CommitTrans, RollBackTrans объекта Connection, т.е. в Вашем случае будет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim con As ADODB.Connection

On Error GoTo err_handler

Set contx = GetObjectContext()
Set con = New ADODB.Connection
con.Provider =  "MSDASQL.1 "
con.ConnectionString =  "DSN=test_errors;User Id=sysdba;Password=masterkey" 
con.Open

'''' Два последовательных запроса 

con.BeginTrans
con.Execute  "insert into err_tbl(errors) values('Test String')" 

con.Execute  "delete from test_tbl where id > 2 "
con.CommitTrans
...

err_handler:
con.RollBackTrans
...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / COM+ транзакция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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