如何在实体框架中管理多个事务

时间:2016-12-01 04:13:09

标签: c# entity-framework transactions

我在使用Entity Framework处理多个事务时发现了一个问题。

请参阅以下方案:

Student table structure

请注意,名称字段是必需的

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()成功。谢谢!

0 个答案:

没有答案