限制满足异步连接条件的同时插入

时间:2016-11-14 09:48:01

标签: c# sql-server entity-framework asynchronous transactions

我知道您通常使用事务来确保并发问题。我不是数据库逻辑方面的专家,但我没有找到任何解释如何根据条件限制插入的内容。

在我的情况下,我有一个内部规则,即用户无法及时打击多个作业。如果请求打卡时间的用户已在打钟,我就会结束第一个。

然而,如果客户端垃圾邮件服务器,他们中的一些人无法找到先前的时间段并插入新记录,幸福地不知道另一个进程也在做同样的事情。

表格基本上如下:

tblTimesheetPunch

system.out

我的支票是:

╔════╦═══════════╦═══════════════╦══════════════╦══════════╗
║ ID ║ FK_UserID ║ StartDatetime ║ StopDatetime ║ FK_JobID ║
╚════╩═══════════╩═══════════════╩══════════════╩══════════╝

我不想在事务期间从插入中锁定整个表。我基本上只想锁定插入当前事务的public async Task<long> StartPunchingTimeOnJob(long jobId) { var currentTimesheets = await DbContext.TimesheetPunch.Where(tsp => tsp.User == Session.User && tsp.StartDateTime != null && tsp.StopDateTime == null) .ToListAsync(); if(currentTimesheets.Count >= 2) { //Fix duplicates } else if(currentTimesheets.Count = 1) { //End the current one } //Insert the requested one and return its ID return newTimesheetPunch.ID; } 值的行。

我错过了有效的标准化方法吗?或者我是否应该尝试将传入的客户端插入请求缓存为任务,并返回插入到所有客户端的ID的所有ID?我不想完全依赖客户限制他们的同时通话,因为有多个客户,我不是他们中的任何一个的开发者。

0 个答案:

没有答案