我现在利用很多的 手持端末 同时访问 WebService这些端末都会把相应的数据信息传给webService ,然后利用WebService生成文件(生成的文件是YYYYMMDDhhmmss+文件名)。在生成文件的时候,我会首先在服务器上判断,这个文件是否存在,如果存在,让文件名名字的地方变为YYYYMMDDhhmmss+1+文件名。尽管是这样,出现冲突的可能性 变得很少了。但是  有很多同时并行访问的时候,可能在一瞬间判断都没生成,结果同时生成了相同的文件。服务器上的文件生成就会冲突。

解决方案 »

  1.   

    YYYYMMDDhhmmss+1本身就不太合理,可以是YYYYMMDDhhmmss+随机数字或者Guid  尽量把可能降到最小
      

  2.   

    使用guid
    使用数据库中的自增字段。
      

  3.   


    刚才说明的不足,文件名字是固定的。日期YYYYMMDDhhmmss+文件名guid是什么?
      

  4.   

    如果这个文件名要保存到数据库中,那可以利用数据库的事务功能防止重名,
    insert into xxx select max(xxx)+1另外,也可以定义静态变量,用锁定的方法防止重名
    object obj = "xxxx";
    string getfilename() { lock(obj) {  return xxx; } }
      

  5.   


    我对于LOCK那个比较感兴趣,我从网上页查找了下,LOCK是能防止并发操作,当前用户操作完,下个用户才能再进行操作这样的话:是不是不管有多少人同时访问WEbService,只要第一个人的LOCK没有放开,下面的那些人都回等待。对吗?
      

  6.   

    设置一个全局的变量,保存最新文件名,每次生成新文件时,记录最新文件名。这样可以保证文件名不会冲突。文件生成还真不是到怎么使用Lock限制。
      

  7.   

    YYYYMMDDhhmmssfff 就差不多了
      

  8.   

    struct FileName
            {
                private static object _sysObj = new object();
                private static DateTime Time = DateTime.MinValue;
                private static int Number;
                public static string Preffix
                {
                    get
                    {
                        lock (_sysObj)
                        {
                            var now = DateTime.Now;
                            if (Time.Date == now.Date && Time.TimeOfDay.TotalSeconds == now.TimeOfDay.TotalSeconds)
                            {
                                Number++;
                                return Time.ToString("yyyyMMddHHmmss") + "+" + Number.ToString();
                            }
                            else
                            {
                                Time = now;
                                Number = 0;
                                return Time.ToString("yyyyMMddHHmmss");
                            }
                        }
                    }
                }
            }
    用FileName.Preffix就行