我正在使用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一起使用的命令。列表中的命令可能链接到几个不同的数据库和外部系统,这些数据库必须全部运行才能使数据保持一致状态。
答案 0 :(得分:0)
事务应该是一个短暂的对象。 NHibernate也不支持嵌套事务,因此无济于事。
您应该重新考虑处理交易的方式;我建议你阅读工作单元模式。