代码之家  ›  专栏  ›  技术社区  ›  Hannoun Yassir

如何强制Nhibernate事务失败?

  •  1
  • Hannoun Yassir  · 技术社区  · 16 年前

    我不能修改源代码,我只需要让它失败!

    例子:

    public void DoSomething(/*Some parameters*/){
    using (var tx = _session.BeginTransaction())
    {
        try
        {
            //Do something
            tx.Commit();
        }
        catch (Exception)
        {
            if (tx != null) tx.Rollback();
                throw;
        }
    } }
    
    7 回复  |  直到 16 年前
        1
  •  3
  •   epitka    16 年前

        2
  •  2
  •   yfeldblum    16 年前

    引发异常:

    using(var sess = sf.OpenSession())
        using(var tx = sess.BeginTransaction())
            throw new Exception();
    

    关闭连接:

    using(var sess = sf.OpenSession())
        using(var tx = sess.BeginTransaction())
            sess.Connection.Close();
    

    回滚事务:

    using(var sess = sf.OpenSession())
        using(var tx = sess.BeginTransaction())
            tx.Rollback();
    
        3
  •  1
  •   Kevin Pang    16 年前

        4
  •  0
  •   Chris Marisic    16 年前

    一个想法是,当您调试时,在查询执行开始之前立即停止,关闭数据库,然后让代码运行。然而,我认为有一种更好、更具程序性的方法来测试这一点。

        5
  •  0
  •   Joshua    16 年前

    设置事务内部代码读取的一些全局变量(我知道人们有全局变量,但这是一个很好的用法),如果它看到变量集,就会抛出异常。

        6
  •  0
  •   Paco    16 年前

        7
  •  0
  •   tolism7    16 年前

    一种方法是:

    [Test]
    public void VerifyExceptionIsThrown()
    {
        Assert.Throws<NHibernate.HibernateException>(
           () =>
           {
                 using (var tx = _session.BeginTransaction())
                 {
                     _session.Update(new Entity());
                     tx.Commit();
                 }
           });
    }
    

    尝试更新临时实体将抛出一个exeption。

    或者,如果使用NHibernateValidator,则可能会显式地使已设置的验证失败,例如,实体的名称属性长度不应超过10个字符。 如果使用长度超过10个字符的字符串填充实体的Name属性,并尝试保存该属性,则tx.Commit()将引发异常。