我在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我的意思是)
我希望我很清楚 谢谢你的任何澄清,
答案 0 :(得分:1)
我假设“数据库ID”是SQL Server中的IDENTITY列。身份号码不是交易的一部分。它们是独立绘制的。
ID生成后永远不会改变。回滚情况(以及其他情况)也可能存在ID差距。
不保证ID是连续的。他们只是柜台。