甩掉DTC,实现客户端控制事务-WCF的状态

2008-04-23 11:51:10.0     推荐:0    收藏:0    评论:0     来源:e800.com.cn
把事务放到客户端控制,实际上控制还是在服务器端的,只不过操作权给了客户端而已。思路和WebService实现是一样的,即用WCF的状态化记住控制事务所需的对象,然后给客户端提供接口来操作这些对象。

闲话少说,代码如下:

服务器端代码:

[ServiceContract(SessionMode=SessionMode.Required)]
public interface IMyService
{
[OperationContract(IsTerminating=true)]
void ReleaseSession();
[OperationContract]
void BeginTransaction();
[OperationContract]
void CommitTransaction();
[OperationContract]
void RollbackTransaction();
[OperationContract]
int ExecuteNonQuery(string strCmdText);
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class MyService : IMyService
{
private string strConnString = "server=namihei2\\KHOS;database=AEGIS_TEST;uid=sa;pwd=

Password01

!";
private SqlConnection mySqlConnection;
private SqlTransaction mySqlTransaction;

public void ReleaseSession()
{
if (mySqlConnection.State == ConnectionState.Open)
{
mySqlConnection.Close();
}
}
public void BeginTransaction()
{
mySqlConnection = new SqlConnection(strConnString);
mySqlConnection.Open();
mySqlTransaction = mySqlConnection.BeginTransaction();
}
public void CommitTransaction()
{
mySqlTransaction.Commit();
}
public void RollbackTransaction()
{
mySqlTransaction.Rollback();
}
public int ExecuteNonQuery(string strCmdText)
{
try
{
SqlCommand objSqlCommand = new SqlCommand(strCmdText);
objSqlCommand.Connection = mySqlConnection;
objSqlCommand.Transaction = mySqlTransaction;
return objSqlCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
}

客户端代码:

static void Main(string[] args)
{
Console.WriteLine("Session Transaction Begin");
SessionTrans.MyServiceClient serviceProxy = new ConsoleTest.SessionTrans.

MyServiceClient();
try
{
serviceProxy.BeginTransaction();
serviceProxy.ExecuteNonQuery("update ATMAccount set Amount = 1000");
serviceProxy.ExecuteNonQuery("insert into ATMLog(AccountNumber,OperationType)

values ('888', 'good')");
//serviceProxy.ExecuteNonQuery("insert into ATMLog(AccountNumber,OperationType)

values ('888', 'goodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgoodgood')");
serviceProxy.CommitTransaction();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
serviceProxy.RollbackTransaction();
}
finally
{
serviceProxy.ReleaseSession();
serviceProxy.Close();
}

Console.WriteLine("Session Transaction End");
Console.Read();

[第1页]   [第2页]   [下一页]
您可以针对本文进行:[评论]  [收藏]  [推荐]  
  • 共有0条评论  点击查看更多评论
  • 网友评论仅供网友表达个人看法,并不表明e800同意其观点或证实其描述
我想发表评论:
用户名密码
  • 匿名发表
    验证码: