我试图找出正确的方式向原子增加一个计数器在一个表中,使用递增的价值作为一个伪仅显示ID记录在另一个。

什么我是一个公司表和工作表。我希望每个公司有它自己的一套job_numbers.我的确有自动增加job_id,但这些数字是共有的跨越所有的公司。即:作业的人数应该增加一般没有差距为每个公司。

即:

  • 公司(company_id,next_job_number)
  • 工作(company_id,job_id,job_number)

目前我这样做(如上的一个方法部分的工作类):

public void SaveJob()
{
    using (var scope = new System.Transactions.TransactionScope())
    {
        if (job_id == 0)
        {
            _db.Update<company>()
                .SetExpression("next_job_number").EqualTo("next_job_number+1")
                .Where<company>(x => x.company_id == company_id)
                .Execute();

            company c = _db.companies.SingleOrDefault(x => x.company_id == company_id);

            job_number = c.next_job_number;
        }

        // Save the job
        this.Save();

        scope.Complete();
    }
}

它似乎工作,但是我不确定如果存在缺陷在这里?它只是感觉是错误的,但我不知道该怎么做到这一点。

任何建议赞赏。

有帮助吗?

解决方案

第一,

你应该使用TransactionScope与SharedDbConnectionScope或交易不正常工作。

第二,

我会用另一种办法与一个单一的声明,而不需要保存job_id与公司)

  1. 保存记录与job_number=0

  2. 更新的记录与这样的事情

    更新工作设置JOB_NUMBER= (选择MAX(job_number)+1从工作的地方company_id=12345) 在job_id="+这一点。job_id;

(你只需要转换这种查询的亚音语法,我不用subsonic3) 应保证工作的数量都是独特的每一家公司(如果你的包裹都保存和更新命令在交易和使用表锁定)。

其他提示

使用动态码,以获得当前最高值可能是危险(潜在的重复值)在高量的多用户系统。

另一种做法可能是创建一个新的表二列;一个字PK,另一个整数存储有关最后数值。每次你想要一个新的价值、增加价值的记录相关的公司和使用,价值为您的订单的数量。字符PK将包括:

"LAST_ORDER_NUMBER_COMPANY_" + company_id

我有一个存储程序,以打电话的自动开始一个新的记录中第一次一家公司有一个订单,或增量这对于随后的订单和回返的新的订单数值回。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top