Я разрабатываю основное приложение asp.net с EF и MsSql.Я хочу увеличить какое-то поле и быть уверенным, что его значение увеличивается правильно.
Например: значение шага tread1 увеличивается с 10 на 2, поле Thread2 увеличивает то же поле на 1. Результат должен быть 13 .Но на самом деле я получаю 11, потому что поток 2 получает данные до того, как поток 1 будет принят, а поток 2 - после потока 1.
Пример кода:
internal class Program
{
private static void Main(string[] args)
{
try
{
using (var context = new MyContext())
{
context.Database.Migrate();
context.Books.Add(new Book {Amount = 10});
context.SaveChanges();
}
var context1 = new MyContext();
var context2 = new MyContext();
var transaction1 = context1.Database.BeginTransaction();
var transaction2 = context2.Database.BeginTransaction();
var book1 = context1.Books.Single();
var book2 = context2.Books.Single();
book1.Amount += 2;
//some other changes with entities here, so i need transactions
book2.Amount += 1;
//some other changes with entities here, so i need transactions
context1.SaveChanges();
transaction1.Commit();
context2.SaveChanges();
transaction2.Commit();
}
catch (Exception e)
{
Console.WriteLine(e);
}
var result = new MyContext().Books.Single().Amount;
Console.WriteLine($"Result: {result}");
Console.ReadLine();
}
}
public class MyContext : DbContext
{
public virtual DbSet<Book> Books { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=localhost\\SQLEXPRESS;Database=CashboxDomain1;Trusted_Connection=True;ConnectRetryCount=0");
}
}
public class Book
{
public int Id { get; set; }
public string Name { get; set; }
public int Amount { get; set; }
}
Мое приложение является многопоточным, и мне нужны транзакции.
Есть ли способ получить прирост Райта?
Для меня важна производительность.Есть ли более быстрый метод, чем оптимистичный параллелизм + перезагрузка данных при ошибке?