ADO.NET 系列 quiz 2 关于分布式事务。

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

问题:

关于分布式事务的例子:

数据库A 和数据库B 上各有一个bank 表 ( 实际情况下A 和 B 分别在不同的机器上,不同类型的数据库(支持dtc))

表结构如下

BankAccount, Amount

A 数据库中的记录:

A 1000

B 数据库中的数据

B 1000

为了测试方便,没有用 COM+,而是直接在 web service 中测试。

代码如下:

<WebMethod(TransactionOption:=EnterpriseServices.TransactionOption.RequiresNew)> _

Public Function DTSTest() As String

Try

ContextUtil.EnableCommit()

DrawMoneyFromA(100)

DepostMoneyToB(100)

ContextUtil.SetComplete()

Return "OK!"

Catch ex As Exception

ContextUtil.SetAbort()

Return "Failed" + ex.Message

End Try

End Function

Public Sub DrawMoneyFromA(ByVal amount As Long)

'从 A 中提取一定的钱

Dim cnn As New SqlConnection("server=server1;database=A;uid=sa;pwd=Password@1;enlist=false")

cnn.Open()

Dim cmd As New SqlCommand("Update bank set amount=amount - " & amount & " where bankaccount='A'", cnn)

cmd.ExecuteNonQuery()

End Sub

Public Sub DepostMoneyToB(ByVal amount As Long)

'往 B 帐户加入一定的钱

Dim cnn As New SqlConnection("server=server2;database=B;pwd=Password@1;uid=sa;enlist=false")

cnn.Open()

Dim cmd As New SqlCommand("Update bank set amount=amount + " & amount & " where bankaccount='B'", cnn)

Throw New Exception("ff")

cmd.ExecuteNonQuery()

End Sub

然后调用web service, 发现A 的余额是 900, 而 B 的帐户仍旧是 1000 ,分布式事务失败。

可能的原因是什么?

同样上面的代码只要稍作修改就可以了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航