今天通过和远程的朋友测试了一下WebService的事务,解开了我很多的迷惑,也进一步知道了改怎么应用它。
如下代码:
[WebMethod(TransactionOption = TransactionOption.RequiresNew)]
public string Trans(int ThreadSleep,int Money)
{
try
{ //实现一个自动的事物----数据库中BANK的内容
ContextUtil.EnableCommit();
this.SubSqlServer(Money); //访问SqlServer数据库
Thread.Sleep(ThreadSleep);
this.AddSqlServer(Money); //访问SqlServer数据库
ContextUtil.SetComplete(); //如果扣款与加款都成功
return "转帐成功!";
}
catch(Exception e)
{
ContextUtil.SetAbort(); //如果发生异常的就回滚事物。
return "转帐失败:" + e.Message.ToString();
}
}
public void SubSqlServer(int money)
{
try
{
SqlConnection cnn = new SqlConnection(@"data source=bmonkey;uid=sa;pwd=123;initial catalog=test");
cnn.Open();
SqlCommand cmd = new SqlCommand("UPDATE Bank Set money = money - " + money.ToString() + " WHERE UserId = 'a'",cnn);
cmd.ExecuteNonQuery();
}
catch(Exception e)
{
throw new Exception("localhostSQL数据库操作失败::" + e.Message.ToString());
}
}
public void AddSqlServer(int money)
{
try
{
SqlConnection cnn = new SqlConnection(@"server=kongchan;uid=sa;pwd=123;database=test");
cnn.Open();
SqlCommand cmd = new SqlCommand("UPDATE Bank Set money = money + " + money.ToString() + " WHERE UserId = 'a'",cnn);
cmd.ExecuteNonQuery();
}
catch(Exception e)
{
throw new Exception("本地SQL数据库操作失败:" + e.Message.ToString());
}
}
测试环境:不同网段.和ip地址,异地,分别通过两地都调用WebService
开始测试的时候抛出我的本地sqlserver未启动DTC的异常(原来最后也用到了sqlserver的DTC,那么如果是sqlserver和access的话,是否就不能同步了呢?),于是启动DTC;后来还抛出‘0x8004D00E’异常,经过一番折腾,最后还是总算能运行了。而且两个sqlserver的操作也是和当初设想的一样,要吗都成功,要吗都不成功。
最后总结一下其中需要注意的地方:
1。启动sqlserver 的DTC
2。连接字符串一定要用机器名字来连接。如:server=kongchan;uid=sa;pwd=123;database=test 的server。
3。如果调用不成功,可以使用DTCPing.exe工具来测试一下两地的sqlserver的DTC是否正常工作。
4。配置C:/WINNT/system32/drivers/etc下的hosts文件,添加ip地址和机器名的匹配。如下举例:
127.0.0.1 localhost
192.168.0.7 bmonkey
5。DTCPing.exe的下载地址:http://support.microsoft.com/default.aspx?scid=kb;zh-tw;306843,这篇文章还有很多关于Ms DTC 的问题处理办法