使用事务回滚不重置本机ID生成器

时间:2014-01-04 09:01:25

标签: c# asp.net nhibernate firebird

我正在使用Firebird数据库和NHibernate进行对象映射。我有一个名为Product的表,其中包含IDProductName等典型字段,我正在使用Firebird的本机ID生成器为我自动生成ID。当我做一些测试时,我有一些类似于下面的代码:

session.Save(product);

try
{
    transaction.Commit();
}
catch
{
    //couldn't save
    transaction.Rollback();
}
finally
{
    session.Close();
}

想法是尝试保存产品,如果它不起作用,则回滚更改。当我测试它时,记录确实没有保存,但本机ID生成器已被更改。例如,生成器应该从值1开始。当我尝试使用上面的代码添加“坏”记录时,记录不会保存,但生成器将跳转到值2.所以,有没有办法我还要回滚ID生成器的任何更改?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这不是NHibernate的行为,而是数据库引擎。

请检查此问题:SQL Identity (autonumber) is Incremented Even with a Transaction Rollback

出于测试目的,您可以使用不同的生成器,例如Increment,由NHiberante管理,在回滚和重启后...重置该值。检查5.1.4.1. generator,摘录:

  

<强>增量

     

生成任何整数类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。不要在群集中使用。