锁定好吗?

时间:2009-06-24 12:37:23

标签: c# synchronization

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

表格结构

SequenceGenerator
    Year int
    Month int
    NextNumber int

年+月制作主键。序列每月重置一次。

我正在使用Subsonic来生成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));
    }
}

3 个答案:

答案 0 :(得分:5)

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

锁定(_lock)不会保护您不会同时让两个应用程序域与数据库通信。

答案 1 :(得分:2)

当您有多个客户端锁定不同的_lock对象时,不会发生此锁定。您应该使用数据库锁定机制。

答案 2 :(得分:1)

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