У меня многопоточная среда, и каждый поток хочет выбрать строку (или вставить ее, если она не существует) в таблицу и привить что-то в ней.Параллельные вставки/обновления в таблице SQL Server
В основном, каждый поток делает что-то вроде этого:
using (var context = new Entity.DBContext()) {
if(!context.MyTable.Any(...)) {
var obj = new MyTable() {
SomeValue = 0
};
context.MyTable.Add(obj)
}
var row = context.MyTable.SingleOrDefault(...);
row.SomeValue += 1;
context.SaveChanges();
}
Проблемы в примере: конкретная строка имеет SomeValue = 0. Две нити выбрать этот конкретный ряд в то же время, они оба видят 0. -> они оба увеличивают его один раз, а конечный результат в SomeValue будет равен 1, но мы хотим, чтобы оно было 2.
Я предполагаю, что поток, который прибывает сразу после другого, должен ждать (используя блокировку?) для того, чтобы первая была закончена. Но я не могу заставить его работать правильно.
Спасибо.
Чтобы подтвердить - какую систему баз данных вы используете? Вероятно, это должно быть разрешено на уровне SQL. –
Я согласен с Damien_The_Unbeliever. Вы должны использовать [RowVersion] (https://msdn.microsoft.com/en-us/library/ms182776 (v = sql.120) .aspx) для обеспечения атомарного доступа. – JPVenson
Я использую EntityFramework и SQL-Server. –