NHibernate并发更新问题



我目前正在测试我的c#/NHibernate应用程序的并发更新情况。在休眠配置中,CCD_ 1被设置为1秒用于测试目的。我在映射文件中使用hibernateversion

以下是测试代码:

namespace Test
{
class Program
{
static void Main(string[] args)
{
MyHibernateConnector hc = new MyHibernateConnector(); // 1 usage see below; also provides some other hibernate related methods
MyHibernateConfig myhibconfig = new MyHibernateConfig(); // reads and holds hibernate configuration
hc.setHibernateConfig(myhibconfig);
ISession session = hc.getSessionAndStartTransaction();
// getSessionAndStartTransaction() does the following:
// - on first call: reads the hibernate configuration and builds the SessionFactory
// - gets the session as follows:
//   ISession session;
//   if (CurrentSessionContext.HasBind(sf))
//   {
//       session = sf.GetCurrentSession();
//   }
//   else
//   {
//       session = sf.OpenSession();
//       CurrentSessionContext.Bind(session);
//   }
// - and does session.BeginTransaction();
MyClass obj;
IQuery q = session.CreateQuery("select mc from MyClass as mc where mc.ID = ?");
q.SetInt64(0, 60);
l = q.List<MyClass>();
if (l.Count > 0)
obj = l[0];
session.Transaction.Rollback();
// now update obj in another application with autocommit off and do not commit or rollback
/* breakpont is set here */            session = hc.getSessionAndStartTransaction();
try
{
session.Lock(obj, LockMode.Upgrade);
} catch (Exception e)
{
try
{
session.Transaction.Rollback();
}
catch (Exception e2)
{
Type t = e2.GetType();
}
}
// ...
}
}
}

session.Lock(obj, LockMode.Upgrade)上,按照预期抛出异常(GenericADOException(,并显示消息:

could not lock: … for update

如果我现在捕捉到这个异常并尝试执行ISession.Transaction.Rollback(),则会抛出TransactionException

我本以为回滚是解决并发更新情况的适当操作。不是这样吗?什么是适当的行动?TransactionException之后的事务状态是什么?

我使用NHibernate版本5.1.0.0和MySql。数据版本6.10.7.0。Hibernate属性dialectNHibernate.Dialect.MySQL55InnoDBDialect

经过更多的实验,我想我找到了一个解决方案——或者我应该说是一个变通方法:command_timeout0超时后关闭ISession.Connection,因此在回滚前再次打开:

if (session.Connection.State.Equals(ConnectionState.Closed)) // <- !!!
session.Connection.Open();
session.Transaction.Rollback();

这是有效的,我可以在同一会话中进行进一步的事务处理。

为什么这种联系一开始就被关闭了,对我来说仍然是个谜!

我想知道这种行为是否在其他(所有?(底层DBMS和/或驱动程序中常见。

相关内容

  • 没有找到相关文章

最新更新