This simple program
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; }
}
Throws an exception like
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:GitEntityFrameworkStressTestEntityFrameworkStressTestProgram.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.
The SQL table looks like this in SSMS
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…