我在我的asp.net应用程序中使用EF6,现在遇到一个问题,非常烦人,但我似乎找不到好的解决方法。我的代码如下:
问题在于,如果两个客户端同时预定同一时间,就应该注册冲突。而且其中一个调用应该返回消息,即时间段已被预订。但是,如果它们正好在同一毫秒内向服务器发送请求,则不会发生这种情况。两个预订都将被保存而不会出现问题。
我可以通过进行可序列化的硬核锁定范围来解决此问题,但我相信还有更好的方法,只是我自己看不到?
在这种情况下,最佳实践是什么?
using (var scope = TransactionScopeUtil.RepeatableReadMaxTimeoutRequired())
{
bool hasConflict = await BookingService.HasConflictAsync(newBooking);
if (!hasConflict)
{
await BookingRepository.InsertAsync(newBooking);
return Json(AjaxPayload.Success());
}
else
{
return Json(AjaxPayload.Error());
}
}
// The transaction scope builder:
public static TransactionScope ReadCommittedMaxTimeoutRequired()
{
return new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TransactionManager.MaximumTimeout
}, TransactionScopeAsyncFlowOption.Enabled);
}
问题在于,如果两个客户端同时预定同一时间,就应该注册冲突。而且其中一个调用应该返回消息,即时间段已被预订。但是,如果它们正好在同一毫秒内向服务器发送请求,则不会发生这种情况。两个预订都将被保存而不会出现问题。
我可以通过进行可序列化的硬核锁定范围来解决此问题,但我相信还有更好的方法,只是我自己看不到?
在这种情况下,最佳实践是什么?