首页 新闻 会员 周边 捐助

数据重复提交?

0
悬赏园豆:120 [已关闭问题] 关闭于 2010-12-29 17:55

最近写了个小小的活动,前端页面有一个按钮 按钮调用事件如下:

function fn_getInfo()

{

$.get("../Code/Ajax.ashx?type=2&uarea=" + currselectvalue + "&urole=" + args + "&rid=" + Math.random(), "", function(responseValue) {

...............}

}

这个异步调用的方法如下:

public string ToSendPrizesUser()

{

    .........................................

      int xx =  查询日志 (日志方法加了try {}cathc{}块 默认值返回-1   )

  if(xx ==0)

      {

          result =   ToPrizes()  方法如下

      }else { result = 0;}

   return result;

}

 

        public static int ToPrizes(.............................................................)
        {
            int result = 0;
            TransactionOptions option = new TransactionOptions();
            option.IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead;

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
            {
                try
                {
                    DataView dv = GetRoleInfo(.....);
                    if (dv.Count > 0)
                    {
                        DataRowView dr = dv[0];

                        int dwi = 方法(调用接口发送数据);
                        if (dwi == 5)  // 发送成功
                        {
                              //写日志
                            int logi = Code.DecemberActiveLog.AddActiveLog(.....................l);
                            if (logi > 0) //日志写成功
                            {
                                result = 1;//成功
                            }
                        }
                    }
                    scope.Complete();
                }
                catch (Exception ex) { throw ex; }
                finally { scope.Dispose(); }
            }
            return result;
        }

 日志查询方法:


        public static int ToolsDayExists(int userid)
        {
            int result = -1;

            StringBuilder strsql = new StringBuilder();
            strsql.AppendFormat(@"SELECT Count(*) FROM NovemberSendLog WHERE UserID = '{0}' ", userid);

            try
            {
                object obj = SqlHelper.ExecuteScalar(Config.ConnectionString, CommandType.Text, strsql.ToString());

                if (obj != DBNull.Value && obj != null)
                {
                    result = int.Parse(obj.ToString());
                }
            }
            catch
            { result = -1; }
            return result;
        }

出现问题,有及个别用户产生了两条日志记录!情况如下:

222.137.149.186        2           1           2010-12-08 23: 32:21.000       1    
222.137.149.186        2           1           2010-12-08 23:32:22.000       0    

我对异步也不是很熟悉,只是用起来比较简单,不知道哪位大侠能帮我分析下 问题出在那里?

不求详解,有个思路就行~  万分感谢!

问题补充: (条件:在查询日志表没有记录的情况下,调用ToPrizes(),也就是说每个用户永远都只会有一条记录!)
失忆的烟的主页 失忆的烟 | 初学一级 | 园豆:8
提问于:2010-12-16 15:56
< >
分享
所有回答(3)
0

你希望每个用户只有一条记录,那么就存在一个唯一值的问题,在网络上,一般是用IP地址来做判断吧。

 

首先,你可以先根据IP地址在数据库里搜索下,如果已经存在该IP,那么就不用插入该数据,同时在页面提示“已经提交过了”的提示即可。。。

lzhdim | 园豆:650 (小虾三级) | 2010-12-16 16:15
@失忆的烟: 唯一的记录,那你用数据库约束不是更好。这样多出来的那条数据会被约束所阻挡而无法插入数据了。。。
支持(0) 反对(0) lzhdim | 园豆:650 (小虾三级) | 2010-12-16 17:22
@失忆的烟: 你是对该表进行的查询么,没看到把用户ID传进来进行查询啊。。。 1、在页面上对该按钮做限制,即点击了以后立即enabled=false;防止重复点击; 2、检查该查询SQL,看看是否有遗漏的用户ID的查询条件; 3、将代码if(xx ==0) 改为if(xx != -1) 以确定条件判断。
支持(0) 反对(0) lzhdim | 园豆:650 (小虾三级) | 2010-12-16 17:53
@失忆的烟: 最好的方法就是设断点调试一下。在VS里F9设置断点在那个查询那里,然后在页面快速的点击按钮两次,这样就会发送两次异步请求,这时候可以进行调试了。。。 1、通过你的记录,两条记录相差1秒。说明是快速点击了两次。 2、在这里,同步请求和异步请求关系不大。都是快速点击了两次,发送了两次。 设断点调试一下吧。。。。。。
支持(0) 反对(0) lzhdim | 园豆:650 (小虾三级) | 2010-12-16 18:08
@失忆的烟: 还有时间,可以等待其他高手来处理,呵呵。。。下班了吧,祝快乐。。。
支持(0) 反对(0) lzhdim | 园豆:650 (小虾三级) | 2010-12-16 18:09
谢谢
支持(0) 反对(0) 失忆的烟 | 园豆:8 (初学一级) | 2010-12-16 18:12
@失忆的烟: 定期删除重复数据吧。。。参见我的: http://www.cnblogs.com/lzhdim/archive/2009/08/30/1556762.html
支持(0) 反对(0) lzhdim | 园豆:650 (小虾三级) | 2010-12-20 11:27
0

用cookie

慧☆星 | 园豆:5722 (大侠五级) | 2010-12-16 22:50
0

试试用存储过程

勤劳的渔网工作者 | 园豆:572 (小虾三级) | 2010-12-17 14:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册