EF Transaction回滚是否会对同时到达的其他请求产生影响?

时间:2015-02-07 21:57:46

标签: c# entity-framework transactions rollback

我在C#应用程序中使用实体框架6。

我有以下逻辑

using (var context = new MyContext())
{
    using (var dbContextTransaction = context.Database.BeginTransaction())
    {
        try
        {
            // Do LogicA
            // Insert a new user to the database 
            context.SaveChanges();

            // Take the inserted userID. 
            // Do LogicB
            context.SaveChanges();

            dbContextTransaction.Commit();
            return user;
        }
        catch (Exception)
        {
            dbContextTransaction.Rollback();
            return null;
        }

    }
}

基本上我是在LogicA中将用户插入数据库,为了继续使用logicB,我需要他的ID(来自数据库,插入后)。这就是为什么我要做2次保存更改。第一个是为了获取用户ID。

我添加了一个Transaction,因为有时,LogicB可能会抛出异常,如果发生这种情况,我想回滚完成的更改(从db中删除用户)

这个逻辑工作正常,但我有一个问题:

假设已经同时发出了2个请求,并且发生了这种特定情况:

请求1 请求2 在相同的时间到达

情景:

请求1 执行LogicA,插入user1并保存更改

请求2 执行LogicA,插入user2并保存更改

请求1 为user1获取ID,执行LogicB,发生异常,通过删除user1来回滚更改,返回null

请求2 为user2获取ID,Do LogicB,LogicB不会抛出异常,一切正常,返回user2

由于很难再现这种情况,我想问一些令我担忧的事情:

最后,问题是:)

如果插入用户1的请求失败,但用户2成功,user2的数据库ID是否会更改? (因为当我回滚时user1被删除了)用户2是否更改了他的ID以适应其他请求中发生的回滚,或者他是否保持与最初分配的相同ID? (他的数据库ID我的意思是)

我希望我很清楚 谢谢你的任何澄清,

1 个答案:

答案 0 :(得分:1)

我假设“数据库ID”是SQL Server中的IDENTITY列。身份号码不是交易的一部分。它们是独立绘制的。

ID生成后永远不会改变。回滚情况(以及其他情况)也可能存在ID差距。

不保证ID是连续的。他们只是柜台。