读书人

Com+ 多个数据库时怎么用com+的事务

发布时间: 2012-12-15 15:16:03 作者: rapoo

Com+ 多个数据库时,如何用com+的事务处理?
我建了两个Access测试 1.mdb 有张表 t1 有 id,和name 字段, 其中id字段没有设唯一索引
2.mdb 有张表 t2 有id 和name字段,但id字段有唯一索引。
然后建两个系统odbc源:db1和db2

然后建dll,已能通过客户端正常创建这个com+对象,但com+ 事务并没有像我预期的那样,当插入一个数据库失败时,另一个数据库的操作回滚。
Com+ dll 的代码如下:
Public Sub Add()
On Error GoTo nErr

1: Dim objCtx As ObjectContext

2: Set objCtx = GetObjectContext()
'
4: Dim strCnnString1 As String, strCnnString2 As String
5: strCnnString1 = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=db1;"
6: strCnnString2 = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=db2;"

7: Dim cnn1 As ADODB.Connection
8: Dim cnn2 As ADODB.Connection
9: Set cnn1 = New ADODB.Connection
10: Set cnn2 = New ADODB.Connection


11: cnn1.Open strCnnString1
12: cnn2.Open strCnnString2

13: cnn1.Execute "insert into t1(id,name) values(1,'yy')"

14: cnn2.Execute "insert into t2(id,name) values(1,'yy')"
'
15: objCtx.SetComplete


16: If cnn1.State = adStateOpen Then
17: cnn1.Close
18: Set cnn1 = Nothing
19: End If
'
20: If cnn2.State = adStateOpen Then
21: cnn2.Close
22: Set cnn2 = Nothing
23: End If

24: Exit Sub

nErr:

objCtx.SetAbort
If Not cnn1 Is Nothing Then
If cnn1.State = adStateOpen Then
cnn1.Close
End If
Set cnn1 = Nothing
End If
If Not cnn2 Is Nothing Then
If cnn2.State = adStateOpen Then
cnn2.Close
End If
Set cnn2 = Nothing
End If
Err.Raise Err.Number, "第" & Erl & "行 出错 " & "事务失败回滚,原因:", Err.Description


End Sub

客户端测试代码如下:
Private Sub Command1_Click()
Dim obj As Object
On Error GoTo nErr
Set obj = CreateObject("TestComTrans.Class1")
obj.Add


MsgBox "事务成功"
Exit Sub
nErr:
MsgBox Err.Source & Err.Description, vbOKOnly, Err.Number
End Sub




[最优解释]
access不支持COM+。
[其他解释]
两个数据库换成SQLServer2000后面,COM+事务和预期的一样了。
是不是ACCESS不支持COM+事务?
那些数据库支持COM+事务? Sybase 支持吗? Oracle呢?
[其他解释]
实现事务有好几种方法,不一定都要放在数据库端,而且Access的事务一般是由connection对象实现的
[其他解释]
利用一下connection对象的事务处理

conn.BeginTrans

conn.Execute strsql


conn.CommitTrans

conn.RollbackTrans
[其他解释]
cnn.BeginTrans'开始新事务
cnn.Execute sql
If cnn.Errors.Count > 0 Then '如果有错误
cnn.RollbackTrans '(回滚)取消当前事务中所作的任何更改并结束事务。它也可能启动新事务。
Else
cnn.CommitTrans '保存任何更改并结束当前事务
End If
[其他解释]
数据库本身的事务处理,只能保证一个数据库的数据完整性,不能保证多个数据库的数据完整性。比如有一个应用,要求在两家单位的两个数据库系统中,一个单位出库,另一个单位入库,必须保这个操作是具有原子性的, 而且这家单位,数据库产品,也可能不一样。再比如说银行间转帐。
[其他解释]
学习一下。。。。
[其他解释]
现在我写的组件只有MS SQLSever 可以用Com+ 事务. sybase 试了,没有成功!
好像很多数据库是用的XA事务规范。 vb怎么写支持XA事务规范的组件呢?
[其他解释]
我只是路过

读书人网 >VB

热点推荐