我在使用Entity Framework处理多个事务时发现了一个问题。
请参阅以下方案:
请注意,名称字段是必需的
Student
实体:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public double score { get; set; }
}
管理两笔交易:
var db = new TestContext();
var student1 = new Student()
{
//Name = "John",
Age = 30,
score = 70
};
var student2 = new Student()
{
Name = "Peter",
Age = 50,
score = 75
};
using (var trans1 = db.Database.BeginTransaction())
{
try
{
db.Students.Add(student1);
db.SaveChanges();
trans1.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
trans1.Rollback();
}
}
using (var trans2 = db.Database.BeginTransaction())
{
try
{
db.Students.Add(student2);
db.SaveChanges();
trans2.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
trans2.Rollback();
}
}
db.Dispose();
请注意,第一笔交易是故意失败的,因为student1缺少姓名字段,而student2则没事。
但是,当执行这段代码时,不会创建student1或student2。看来如果第一个事务失败并回滚,第二个事务也会失败。为什么呢?
我希望第二个事务成功,因为如果我删除第一个事务块并且只是独立运行第二个事务,它就可以成功运行。
我找不到任何类似的情况,因此打开一个新线程。非常感谢你澄清我的困惑。
============================================
在这种情况下,似乎交易没有任何意义。以下代码删除了显式事务,但结果完全相同。
var db = new TestContext();
var student1 = new Student()
{
//Name = "John",
Age = 30,
score = 70
};
var student2 = new Student()
{
Name = "Peter",
Age = 50,
score = 75
};
try
{
db.Students.Add(student1);
db.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
try
{
db.Students.Add(student2);
db.SaveChanges();
trans2.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
db.Dispose();
请让我知道为什么我无法获得预期的结果 - 第一个SaveChanges()失败,第二个SaveChanges()成功。谢谢!