I need to do status check before insert data, but I found EF Core does not lock table from read even I setup isolationlevel.
Here is my code: I need to lock SignTicket
table and SignTicketApproval
table from read until commit, so that others will not get false data about ticket status. But even I setup the isolation level, I can still read table in SSMS.
I need a table-level lock, because this is a insert-only table, every operation must check the latest record to determine the status of ticket.
Thank you.
using var _context = new EFContext();
using var transaction = _context.Database.BeginTransaction(System.Data.IsolationLevel.Serializable);
var ticket = _context.SignTicket
.Include(x => x.SignTicketApproval)
.ThenInclude(x => x.Result)
.Single(x => x.Id == cancelSignTicketRequest.SignTicketId.ToLong());
if (_signTicketService.GetTicketStatus(ticket) != TicketStatus.Open)
{
throw new SignTicketStatusException("Ticket status is not open", ticket);
}
// Create new fake approval request and set __Cancel as outcome
var utcNow = DateTime.UtcNow;
var cancelSignoff = new SignTicketApproval()
{
AssignedTo = cancelSignTicketRequest.CanceledBy,
Description = "User cancel",
CreateTime = utcNow,
Result = new SignTicketApprovalResult()
{
Canceled = true,
ApproverEmail = cancelSignTicketRequest.CanceledBy,
CreateTime = utcNow,
Outcome = ReservedButton.CancelButton,
Comment = cancelSignTicketRequest.Reason
}
};
ticket.SignTicketApproval.Add(cancelSignoff);
_context.SaveChanges();
transaction.Commit();