跨数据库事务提交问题!!

飞鸿踏雪2018 2003-10-15 09:00:11
在VB中通过调用COM+实现跨数据库的事务提交(引用COM+ Services Type Library),如果这两个数据库在同一网段内,则能正常运行,如果这两个数据库不在同一网段,则事务不能提交,每次都要回滚。其中一个函数的代码如下:

Public Function Set_DownFwFromDc(ByVal chrzzjgbm As String, ByVal DcZzjgbm As String, ByVal intgwlsh As Long, ByVal strConnOa As String, ByVal strConnDc As String)

On Error GoTo ErrHandle:

Dim ConnDc As New ADODB.Connection
Dim ConnOa As New ADODB.Connection
Dim RsDc As New ADODB.Recordset
Dim RsDc2 As New ADODB.Recordset
Dim RsOa As New ADODB.Recordset
Dim RsOa2 As New ADODB.Recordset
Dim strSql As String
Dim intOagwlsh As Long
Dim intgwfjlsh As Long

#If value = 1 Then
Dim objContext As COMSVCSLib.ObjectContext
Set objContext = GetObjectContext()
objContext.EnableCommit
#End If

If ConnOa.State <> 0 Then ConnOa.Close
If ConnDc.State <> 0 Then ConnDc.Close
ConnOa.Open strConnOa
ConnDc.Open strConnDc

'1、将重庆市工商局zfw、fjb表中的记录取到本单位OA的sbw、fjb中
'1.1添加到sbw
strSql = "select * from zfw where intgwlsh=" & CStr(intgwlsh)
RsDc.Open strSql, ConnDc, adOpenForwardOnly, adLockReadOnly
If Not RsDc.EOF Then
'先取得sbw表的流水号
strSql = "Execute prcGetAllLsh 'gwlsh'"
Set RsOa2 = ConnOa.Execute(strSql)
intOagwlsh = RsOa2.Fields(0).value
RsOa2.Close

strSql = "Select top 0 * from sbw"
RsOa.Open strSql, ConnOa, 1, 3
RsOa.AddNew
RsOa.Fields("intgwlsh").value = intOagwlsh
RsOa.Fields("chrgwz").value = RsDc.Fields("chrgwz").value
RsOa.Fields("intgwnh").value = RsDc.Fields("intgwnh").value
RsOa.Fields("intgwqh").value = RsDc.Fields("intgwqh").value
RsOa.Fields("chrzzjgbm").value = Trim(DcZzjgbm)
RsOa.Fields("dtmlwrq").value = Format(Now, "yyyy-mm-dd hh:mm")
RsOa.Fields("chrlwbt").value = Trim(RsDc.Fields("chrgwbt").value)
RsOa.Fields("intlwfs").value = 1
RsOa.Fields("intmjbm").value = RsDc.Fields("intmjbm").value
RsOa.Fields("intflbm").value = 0
RsOa.Fields("chrlwsy").value = ""
'RsOa.Fields("txtzw").value = Null
RsOa.Fields("intsxh").value = 0
'RsOa.Fields("chrsjr").value = Null
'RsOa.Fields("chrcbcs").value = Null
'RsOa.Fields("chrcbr").value = Null
'RsOa.Fields("txtcljg").value = Null
'RsOa.Fields("dtmbjrq").value = Null
If IsNull(RsDc.Fields("chrztc")) = False Then
RsOa.Fields("chrztc").value = Trim(RsDc.Fields("chrztc").value)
End If
'RsOa.Fields("txtlbyj").value = Null
RsOa.Fields("inthjcdbm").value = RsDc.Fields("inthjcdbm").value
RsOa.Fields("chrtzfs").value = "1"
RsOa.Fields("chrzzdz").value = "2"
RsOa.Fields("chrqbbz").value = "1"
'RsOa.Fields("chrlwqfr").value = Null
'RsOa.Fields("chrtsfjbz").value = Null
RsOa.Fields("chrGdbz").value = "0"
RsOa.Update
RsOa.Close
End If
RsDc.Close

'1.2添加到fjb
'正文稿的最后一稿
strSql = "select top 1 * from fjb where intgwlsh=" & CStr(intgwlsh) & " and intfjbh=1 order by intbbbh desc"
RsDc.Open strSql, ConnDc, adOpenForwardOnly, adLockReadOnly
Do While Not RsDc.EOF
'先取得附件的流水号
strSql = "Execute prcGetAllLsh 'intgwfjlsh'"
Set RsOa2 = ConnOa.Execute(strSql)
intgwfjlsh = RsOa2.Fields(0).value
RsOa2.Close

strSql = "Select top 0 * from fjb"
RsOa.Open strSql, ConnOa, 1, 3
RsOa.AddNew
RsOa.Fields("intgwfjlsh").value = intgwfjlsh
RsOa.Fields("intgwlsh").value = intOagwlsh
RsOa.Fields("chrfjlxbm").value = RsDc.Fields("chrfjlxbm").value
RsOa.Fields("intfjbh").value = RsDc.Fields("intfjbh").value
RsOa.Fields("chrfjmc").value = Trim(RsDc.Fields("chrfjmc").value)
RsOa.Fields("txtfj").value = RsDc.Fields("txtfj").value
RsOa.Fields("intbbbh").value = 1
RsOa.Update
RsOa.Close
' If IsNull(RsDc.Fields("txtfj").value) = False Then
' strSql = "select * from fjb where intgwfjlsh=" & CStr(intgwfjlsh)
' RsOa.Open strSql, ConnOa, adOpenKeyset, adLockOptimistic
' RsOa.Fields("txtfj").AppendChunk RsDc.Fields("txtfj").value
' RsOa.Update
' RsOa.Close
' End If
RsDc.MoveNext
Loop
RsDc.Close

'2、修改重庆市工商局fw的记录
strSql = "update fw set chrxzbz='1' where intgwlsh=" & CStr(intgwlsh) & " and chrzzjgbm='" & Trim(chrzzjgbm) & "'"
ConnDc.Execute (strSql)

#If value = 1 Then
If Not objContext Is Nothing Then objContext.SetComplete
If Not objContext Is Nothing Then Set objContext = Nothing
#End If

Set_DownFwFromDc = 1

Set RsDc = Nothing
Set RsDc2 = Nothing
Set RsOa = Nothing
Set RsOa2 = Nothing
If ConnOa.State <> 0 Then ConnOa.Close
If ConnDc.State <> 0 Then ConnDc.Close
Set ConnOa = Nothing
Set ConnDc = Nothing

Exit Function

ErrHandle:
WriteWrongLog Now(), Err.Number, Err.Description, strSql, "Set_DownFwFromDc"
Err.Clear
#If value = 1 Then
If Not objContext Is Nothing Then objContext.SetAbort
If Not objContext Is Nothing Then Set objContext = Nothing
#End If

Set_DownFwFromDc = 0

Set RsDc = Nothing
Set RsDc2 = Nothing
Set RsOa = Nothing
Set RsOa2 = Nothing
If ConnOa.State <> 0 Then ConnOa.Close
If ConnDc.State <> 0 Then ConnDc.Close
Set ConnOa = Nothing
Set ConnDc = Nothing

End Function
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanbaibai 2003-11-14
  • 打赏
  • 举报
回复
用com+事务
yujohny 2003-10-18
  • 打赏
  • 举报
回复
晕,
只能帮你up
飞鸿踏雪2018 2003-10-18
  • 打赏
  • 举报
回复
两个数据库能能够连接正常,在不实现事务的情况下,可以进行正常的处理
liuyun2003 2003-10-16
  • 打赏
  • 举报
回复
你使用ODBC建立一个连接,然后利用这个连接在数据库里建立链接服务器试试。
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧