首页 > 编程 > .NET > 正文

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

2024-07-10 13:03:15
字体:
来源:转载
供稿:网友
问题:
关于分布式事务的例子:

数据库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;[email protected];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;[email protected];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 ,分布式事务失败。

可能的原因是什么?

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

,欢迎访问网页设计爱好者web开发。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表