我知道您通常使用事务来确保并发问题。我不是数据库逻辑方面的专家,但我没有找到任何解释如何根据条件限制插入的内容。
在我的情况下,我有一个内部规则,即用户无法及时打击多个作业。如果请求打卡时间的用户已在打钟,我就会结束第一个。
然而,如果客户端垃圾邮件服务器,他们中的一些人无法找到先前的时间段并插入新记录,幸福地不知道另一个进程也在做同样的事情。
表格基本上如下:
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?我不想完全依赖客户限制他们的同时通话,因为有多个客户,我不是他们中的任何一个的开发者。