gpt4 book ai didi

nhibernate - 处理 NHibernate 事务错误

转载 作者:行者123 更新时间:2023-12-04 15:48:52 25 4
gpt4 key购买 nike

我们的应用程序(使用 NHibernate 和 ASP.NET MVC)在进行压力测试时会抛出很多 NHibernate 事务错误。主要类型有:

  • 事务未连接或已断开
  • 行已被另一个事务更新或删除(或未保存的值映射不正确)
  • 事务(进程 ID 177)在锁定资源上与另一个进程发生死锁,并已被选为死锁牺牲品。重新运行事务。

  • 有人可以帮我找出异常(exception) 1 的原因吗?
    我知道我必须处理代码中的其他异常。有人可以向我指出可以帮助我以有效方式处理这些错误的资源吗?

    问:我们如何管理 session 和交易?

    答:我们正在使用 Autofac。对于每个服务器请求,我们创建一个新的请求容器,该容器在容器生命周期范围内具有 session 。在激活 session 时,我们开始事务。当请求完成时,我们提交事务。在某些情况下,交易可能是巨大的。为简化起见,每个服务器请求都包含在一个事务中。

    最佳答案

    看看这个线程:
    http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=85016

    基本上它所说的可能是导致此异常的原因:

    2010-02-17 21:01:41,204 1 WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException: The transaction log for database 'databasename' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases



    由于事务日志的大小与事务期间完成的工作量成正比,也许您应该考虑将事务边界跨命令处理程序“处理”事务写入部分的命令。然后,您可以使用 session#X 加载您希望改变的状态,改变它并提交它,所有这些都作为 #X 中的一个工作单元。

    关于事物的读取端,您可能会有另一个 ISession#Y 读取数据;此 ISession 可用于批量读取,例如RepeatableRead 或类似 Futures 功能的东西,可以简单地从缓存中读取(尽管它确实是一个拐杖)。这样做可能会帮助您从不是的“错误”中恢复;活锁、死锁和受害者事务。

    每个请求使用事务的问题在于,您的 ISession 在您工作时获取了大量簿记数据,所有这些都是事务的一部分。因此,数据库将数据(rols、cols、tables 等)标记为参与事务,导致等待图跨越“实体”(在数据库意义上,而不是 DDD 意义上),它们实际上不是一部分您的应用程序采用的命令的事务边界。

    为了记录(其他人在谷歌上搜索这个),法比奥有 a post处理来自数据层的异常处理。引用他的一些代码;
    public class MsSqlExceptionConverterExample : ISQLExceptionConverter
    {
    public Exception Convert(AdoExceptionContextInfo exInfo)
    {
    var sqle = ADOExceptionHelper.ExtractDbException(exInfo.SqlException) as SqlException;
    if(sqle != null)
    {
    switch (sqle.Number)
    {
    case 547:
    return new ConstraintViolationException(exInfo.Message,
    sqle.InnerException, exInfo.Sql, null);
    case 208:
    return new SQLGrammarException(exInfo.Message,
    sqle.InnerException, exInfo.Sql);
    case 3960:
    return new StaleObjectStateException(exInfo.EntityName, exInfo.EntityId);
    }
    }
    return SQLStateConverter.HandledNonSpecificException(exInfo.SqlException,
    exInfo.Message, exInfo.Sql);
    }
    }
  • 547 是约束冲突的异常编号。
  • 208 是 SQL 中无效对象名称的异常编号。
  • 3960 是由于更新冲突而中止的快照隔离事务的异常编号。

  • 因此,如果您遇到像您所描述的那样的并发问题;请记住,它们会使您的 ISession 无效,并且您必须像上面那样处理它们。

    您可能正在寻找的部分内容是 CQRS,其中您有单独的读取和写入端。这可能会有所帮助: http://abdullin.com/cqrs/ , http://cqrsinfo.com .

    所以总结一下;您的问题可能与您处理交易的方式有关。另外,尝试运行 select log_wait_reuse_desc from sys.databases where name='MyDBName'看看它给了你什么。

    关于nhibernate - 处理 NHibernate 事务错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3394450/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com