NHibernate,MySQL,InnoDB和嵌套事务

时间:2010-06-17 07:04:05

标签: c# mysql nhibernate transactions innodb

我正在使用NHibernate使用InnoDB表访问MySQL数据库。我知道InnoDB不支持嵌套事务,但我一直认为事情会更简单。

例如,看一下这个方法.. SessionManager为每个线程打开一个新会话。如果我没有存储事务,那么在打开新事件时,mysql会自动提交它。

这只是一个丑陋的解决方法,还是唯一的方法?你有更好的方法吗?

protected override void DoCommand(ICommand command)
{
    // Open session and/or transaction if necessary
    var repoCommand = command as RepositoryCommand;
    if (repoCommand != null)
    {
        foreach (Type type in repoCommand.PersistenceTypes)
        {
            if (!_sessions.ContainsKey(type))
            {
                var session = SessionManager.GetSession(type);
                _sessions[type] = session;

                // Several types might share the same session,
                // so we'll only create one transaction
                // per session instead of per type
                // InnoDB: Gimme nested transactions!
                if (!_transactions.ContainsKey(session))
                {
                    _transactions[session] = session.BeginTransaction();
                }
            }
        }
    }

    base.DoCommand(command);
}

编辑:有关该项目的更多细节..

应用程序使用NHibernate.Burrow连接到多个数据库。每个线程都有自己的Session

每个命令都有一个Do和Undo方法,我打算添加一个CanExecute方法来验证网络上权限等先决条件。每个命令在一个子系统上完成相当少的工作,有些连接到外部系统

此类将尝试在其列表中运行每个命令,如果失败,则回滚更改。 RepositoryCommand是一个与NHibernate一起使用的命令。列表中的命令可能链接到几个不同的数据库和外部系统,这些数据库必须全部运行才能使数据保持一致状态。

1 个答案:

答案 0 :(得分:0)

事务应该是一个短暂的对象。 NHibernate也不支持嵌套事务,因此无济于事。

您应该重新考虑处理交易的方式;我建议你阅读工作单元模式。