Выбран в качестве жертвы тупика при простом Add () -> SaveChanges () - PullRequest
0 голосов
/ 11 сентября 2018

Эта простая программа

private static void Main(string[] args)
{
    Parallel.For(0, 1000000, InsertTestEntity);
}

private static void InsertTestEntity(int i)
{
    using (var dbContext = new TestDbContext())
    {
        dbContext.TestEntities.Add(new TestEntity { HugeString = "Baby shark," + string.Join(", ", Enumerable.Repeat("doo", 500)) });
        dbContext.SaveChanges();
    }
}

public class TestEntity
{
    [Key]
    public int Id { get; set; }

    public string HugeString { get; set; }
}

public class TestDbContext : DbContext
{
    public DbSet<TestEntity> TestEntities { get; set; }
}

Создает исключение как

System.Data.Entity.Infrastructure.DbUpdateException
  HResult=0x80131501
  Message=An error occurred while updating the entries. See the inner exception for details.
  Source=EntityFramework
  StackTrace:
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at EntityFrameworkStressTest.Program.InsertTestEntity(Int32 i) in c:\Git\EntityFrameworkStressTest\EntityFrameworkStressTest\Program.cs:line 18
   at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()

Inner Exception 1:
UpdateException: An error occurred while updating the entries. See the inner exception for details.

Inner Exception 2:
SqlException: Transaction (Process ID 100) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Таблица SQL выглядит так в SSMS

TestEntities table from SSMS

1 Ответ

0 голосов
/ 11 сентября 2018

Как видно на скриншоте SSMS, похоже, нет указания первичного ключа. Рядом со столбцом идентификатора должен был находиться символ ключа.

Some ID actually declared as primary key

Дальнейшая проверка показывает, что идентификатор действительно объявлен как идентификатор (SQL Server для AUTO INCREMENT), но не как первичный ключ. Чтобы сделать Id реальным первичным ключом, щелкните правой кнопкой мыши таблицу в SSMS и выберите «Дизайн», щелкните правой кнопкой мыши строку Id в конструкторе столбцов и выберите «УСТАНОВИТЬ ПЕРВИЧНЫЙ КЛЮЧ»:

enter image description here

После этого стресс-тесты запускаются без блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...