0

Какая транзакция IsolationLevel лучше всего гарантировать, что создаются только 1 Datarow. Предполагается использование SQL Server 2012 и EntityFramework 6.Какой уровень изоляции транзакций можно выбрать для атомарного сценария «Get or Create»

using(var db = new XyzContext()) 
    { 
     using(var dbContextTransaction = db.Database.BeginTransaction(???)) 
     { 
      try 
      { 

       Item obj = db.Item.SingleOrDefault(o => o.Hashcode.Equals(hashCode)); 

//it is possible that 2 threads are coming through here and both have obj == null 

       if(obj == null) 
       { 
        obj = db.Item.Add(new Item 
        { 
         Hashcode = hashCode, 
         State = 0, 

        }); 
       } 

       db.SaveChanges(); 

       dbContextTransaction.Commit(); 
      } 
      catch(Exception) 
      { 
       dbContextTransaction.Rollback(); 
      } 
     } 
    } 
+0

Я добавил дополнительную информацию в свой ответ. –

ответ

0

Если сценарий был обновление, то Snapshot хорошо, (это поведение по умолчанию эф 6).

Но в вашем случае, который является вставкой, большинство методов не будут работать должным образом.

Вы должны быть уверены, что уровень эскалации блокировки - это таблица (по умолчанию). Затем примените RepeatableRead способ осуществления сделки. Это предотвращает чтение других потоков из таблицы, пока не будет выполнена первая нить.

Лучше иметь единственное ограничение на одном из ваших столбцов вместо этого метода.

Или создайте специальную таблицу в своей базе данных sql-сервера, а затем поместите блокировку строки на конкретную запись этой таблицы до вашего основного запроса & вставьте, а затем выполните свои работы, для ваших других операций с этой таблицей нет бутылочной шейки достаточно быстро.

Удача

+0

Так что вы в основном говорите, что RepeatableRead решит мою проблему, если я использую стратегию блокировки транзакций и не хочу использовать уникальное ограничение? – rudimenter

+0

Да, но это слишком дорого. Блокировка строк на конкретной таблице намного лучше, чем это решение. оба они верны. –

+0

Если в вашем сценарии возможно уникальное ограничение, тогда сделайте это, это лучше, чем все из них. –