Я верю, что нет проблем с функцией, но с транзакционным характером операции, которую вы описали.Чтобы решить вашу проблему тривиально, вы можете попробовать использовать транзакцию с наивысшим уровнем изоляции:
using (var transaction = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions
{
// With this isolation level all data modifications are sequential
IsolationLevel = IsolationLevel.Serializable
}))
{
using (var connection = new SqlConnection("YOUR CONNECTION"))
{
connection.Open();
try
{
// Run raw ADO.NET command in the transaction
var command = connection.CreateCommand();
// Your reading query (just for example sake)
command.CommandText = "SELECT TOP 1 FROM dbo.Whatever";
var result = command.ExecuteScalar();
// Run an EF Core command in the transaction
var options = new DbContextOptionsBuilder<TestContext>()
.UseSqlServer(connection)
.Options;
using (var context = new TestContext(options))
{
context.Items.Add(result);
context.SaveChanges();
}
// Commit transaction if all commands succeed, transaction will auto-rollback
// when disposed if either commands fails
transaction.Complete();
}
catch (System.Exception)
{
// TODO: Handle failure
}
}
}
Вы должны настроить код под свои нужды, но у вас есть идея.
Хотя, яЯ бы предпочел полностью избежать этой проблемы и не изменять какие-либо записи, а вставлять их и выбирать последние.Транзакции сложны в применении, они могут привести к снижению производительности и возникновению взаимоблокировок в неправильном месте и неправильным образом.