Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个锁可以吗?_C#_Synchronization - Fatal编程技术网

C# 这个锁可以吗?

C# 这个锁可以吗?,c#,synchronization,C#,Synchronization,我有一个包含序列号的表格 表结构 SequenceGenerator Year int Month int NextNumber int 年+月生成主键。序列每个月重置一次 我用亚音速来产生DAL。为了获得下一个序列号,我编写了一个类,它将下一个序列号返回给请求者: private static readonly object _lock = new Object(); private static readonly string FormatString = "{0}

我有一个包含序列号的表格

表结构

SequenceGenerator
    Year int
    Month int
    NextNumber int
年+月生成主键。序列每个月重置一次

我用亚音速来产生DAL。为了获得下一个序列号,我编写了一个类,它将下一个序列号返回给请求者:

private static readonly object _lock = new Object();
private static readonly string FormatString = "{0}{1}{2}{3}";
private static readonly string NumberFormat = "000000";

public static object GetNextNumber(string prefix)
{
    lock (_lock)
    {
        int yr = DateTime.Now.Year;
        int month = DateTime.Now.Month;

        SequenceGeneratorCollection col = new SequenceGeneratorCollection()
           .Where(SequenceGenerator.Columns.Year, Comparison.Equals, yr)
          .Where(SequenceGenerator.Columns.Month, Comparison.Equals, month)
          .Load();

        if (col==null || col.Count == 0)
        {
            SequenceGenerator tr = new SequenceGenerator();
            tr.Year = yr;
            tr.Month = month;
            tr. NextNumber = 1;
            tr.Save();
            return string.Format(FormatString, prefix, yr, 
                      month,tr.NextNumber.ToString(NumberFormat));
        }

        SequenceGenerator  t = col[0];
        t.NextNumber += 1;
        t.Save();

        return string.Format(FormatString, prefix, yr, month, 
                 t.NextNumber.ToString(NumberFormat));
    }
}

这种锁定确实有风险,如果要确保数据保持一致,应该使用数据库级事务


锁(_lock)不能防止两个应用程序域同时与数据库通信

当您有多个客户端锁定不同的锁定对象时,此锁定将不起作用。您应该为此使用数据库锁定机制。

不推荐使用。这应该在具有自动编号字段的DB中完成。此外,即使您没有在DB中执行此操作,并且仍然选择采用这种方式,请确保锁定的代码量最少,不要将整个方法封装在锁中。

web应用程序将访问代码。这会有什么不同吗?代码将由web应用程序访问。这会有什么不同吗?这取决于web服务器的配置方式,它可能会生成多个进程。在数据库级别锁定会更好。