原子方式保持一个计数器使用的次声Email
-
26-09-2019 - |
题
我试图找出正确的方式向原子增加一个计数器在一个表中,使用递增的价值作为一个伪仅显示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与公司)
保存记录与job_number=0
更新的记录与这样的事情
更新工作设置JOB_NUMBER= (选择MAX(job_number)+1从工作的地方company_id=12345) 在job_id="+这一点。job_id;
(你只需要转换这种查询的亚音语法,我不用subsonic3) 应保证工作的数量都是独特的每一家公司(如果你的包裹都保存和更新命令在交易和使用表锁定)。
其他提示
使用动态码,以获得当前最高值可能是危险(潜在的重复值)在高量的多用户系统。
另一种做法可能是创建一个新的表二列;一个字PK,另一个整数存储有关最后数值。每次你想要一个新的价值、增加价值的记录相关的公司和使用,价值为您的订单的数量。字符PK将包括:
"LAST_ORDER_NUMBER_COMPANY_" + company_id
我有一个存储程序,以打电话的自动开始一个新的记录中第一次一家公司有一个订单,或增量这对于随后的订单和回返的新的订单数值回。
不隶属于 StackOverflow