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

Создаю СОМ+ компонент (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
19.03.2004, 13:52
    #32449247
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM+ транзакция
Точно не знаю, предполагаю, что
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
19.03.2004, 14:35
    #32449371
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM+ транзакция
Попробуй так:

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
19.03.2004, 15:58
    #32449600
ils
ils
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM+ транзакция
2 Green2:
Это очевидно. Вопрос в том, почему два запроса в транзакционном компоненте не выполняются в рамках единой транзакции.
...Вообще предполагаю, что это из-за особенностей реализации транзакций в интербейсе... Но хотелось бы знать наверняка.

2 Antonariy:
1)Зачем вызывать метод SetAbort до того, как вообще что-либо сделано?
2) авторgetobjectcontexst exit_handler: - ??
...
Рейтинг: 0 / 0
19.03.2004, 17:58
    #32449905
Alex_2003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM+ транзакция
Вообще как единую транзакцию это можно сделать с помощью методов 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / COM+ транзакция / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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