首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于WCF客户端与服务端数据事务同步的有关问题!

2012-04-24 
关于WCF客户端与服务端数据事务同步的问题!急……客户端经常掉线,我就想着用WCF事务来做数据同步,现在服务器

关于WCF客户端与服务端数据事务同步的问题!急……
客户端经常掉线,我就想着用WCF事务来做数据同步,现在服务器数据库是ORACLE,客户端数据库是SQLSERVER,我写了一个测试程序,并网数据库里面导入10000条数据,数据同步的时候时不时的拔下网线,结果同步的数据却不一致,废话不多说,直接上代码,请各位大侠指正看哪里不对导致数据不能同步?

客户端执行代码如下:

C# code
public override void mySynchronous()        {            int tableCount = GetTableCount();            string TableCountMessage = string.Format("当前共有未同步数据{0}条!", tableCount);            Console.WriteLine(TableCountMessage);            if (tableCount > 0)            {                Console.WriteLine("开始同步数据……");                MyClientService.HelloServiceClient service = new MyClientService.HelloServiceClient();                System.Transactions.TransactionOptions tran = new System.Transactions.TransactionOptions();                //设置事务超时时间                tran.Timeout = new TimeSpan(3000);                //设置事务的隔离级别                tran.IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead;                DataTable myDataTable = GetUserDataTable();                foreach (DataRow dr in myDataTable.Rows)                {                    using (var ts = new System.Transactions.TransactionScope())                    {                        try                        {                            string name = dr["testName"].ToString();                            string id = dr["userID"].ToString();                            if (service.InserOraclData(name, id))                            {                                updateType(id);                            }                            else                            {                                throw new Exception("服务端插入错误!");                            }                            //service.TransactMyServer(myDataTable);                            Console.WriteLine(string.Format("{0}数据ID:{1}数据更新成功!", DateTime.Now.ToString(), id));                            ts.Complete();                        }                        catch (Exception ex)                        {                            Console.WriteLine(DateTime.Now.ToString() + "数据更新失败!失败原因如下:");                            Console.WriteLine(ex.Message);                            Transaction.Current.Rollback(ex);                        }                    }                }            }                }

服务端InseroraclData方法
C# code
  /// <summary>        /// 添加数据        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true )]        public bool  InserOraclData(string name, string id)        {            string sql = @"INSERT INTO Test1                                       (testName                                       ,TYPE                                       ,userID)                                 VALUES                                       (:testName                                       ,'1'                                       ,:userID)";            OracleConnection mycon = myOracleServerData.myConn;            OracleCommand mycmd = new OracleCommand(sql,mycon);            mycmd.Parameters.Add(new OracleParameter(":testName",name));            mycmd.Parameters.Add(new OracleParameter(":userID",id));            try            {                mycon.Open();                mycmd.ExecuteNonQuery();                return true;            }            catch (OracleException ex)            {                Console.WriteLine(ex);                throw ex;            }            finally { mycon.Close(); }                  }     



客户端updateType方法
C# code
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true )]        public  void  updateType(string id)        {            string sql = @"UPDATE Test1                           SET [type] = 1                         WHERE [userID] = @userID";            SqlConnection myCon = ClientData.myConn;            SqlCommand mycmd = new SqlCommand(sql,myCon);            mycmd.Parameters.Add(new SqlParameter("@userID",id));            try {                myCon.Open();                mycmd.ExecuteNonQuery();            }            catch (Exception ex )            {                Console.WriteLine(ex.Message);                throw ex;            }            finally            {                myCon.Close();            }                                         }


[解决办法]
探讨
楼上的,你看到楼主有做事务处理么,他有会话ID么? 我真没看出来,有的请指出

楼主用了哪个WCF的包,或哪个WCF的类来做重连?

楼主是要同步数据

不知道是谁搞错了

我只是要帮楼主解决同步数据出错的问题

首先,这里是没有WPF或WCF的论坛,只有SILVERLIGH和WEB service

第二,我觉得这个问题应该和数据库有关(其实ORACLE和SQL 2大数据……

[解决办法]
网络环境不可靠,应该考虑如何实现可靠的消息传递,而不仅仅是事务吧。就拿你的例子来说,在事务中频繁断开连接,可能事务超时未到(未导致回滚),而中间断开的连接会导致一些Soap请求丢失。这样最终导致数据不一致(有些成功Commit了,有些丢失了)。

如果要用WCF实现而且是基于HttpBinding的话,感觉就有些难度了。(如果是NetTcpBinding的话,可以实现可靠消息传输),客户端再加上MSMQ就更健壮了。

没有实际操作过,下面两篇文章供参考:Artech的文章里也许能找到答案。
http://www.cnblogs.com/artech/archive/2010/04/18/1715051.html
http://www.cnblogs.com/artech/archive/2007/06/29/799529.html
[解决办法]
探讨

网络环境不可靠,应该考虑如何实现可靠的消息传递,而不仅仅是事务吧。就拿你的例子来说,在事务中频繁断开连接,可能事务超时未到(未导致回滚),而中间断开的连接会导致一些Soap请求丢失。这样最终导致数据不一致(有些成功Commit了,有些丢失了)。

如果要用WCF实现而且是基于HttpBinding的话,感觉就有些难度了。(如果是NetTcpBinding的话,可以实现可靠消息传输),客户端再……

热点排行