[已解决问题] 频频出现的事务错误,求救
提问时间: 2008-07-08 20:23
悬赏分:30 浏览:181 次

不知道为什么。

用到了NHibernate,

一般是这么用

 1             session = NHibernateHelper.GetCurrentSession();
 2             ITransaction tx = session.BeginTransaction();
 3             try
 4             {
 5                 artcileid = (int)session.Save(obj);
 6                 tx.Commit();
 9                 return artcileid;
10             }
11             catch (HibernateException ex)
12             {
13                 if (null != tx) tx.Rollback();
14                 throw new ApplicationException(ex.Message);
15             }
16             finally { NHibernateHelper.CloseSession(); }
 
也有的代码这样:
        public int InsertArticle(Article obj)
        
{
            
int artcileid = 0;
            session 
= NHibernateHelper.GetCurrentSession();
            ITransaction tx 
= session.BeginTransaction();
            
try
            
{
                artcileid 
= (int)session.Save(obj);
                tx.Commit();
                
// 将tags加入Entity_Tag表
                TagDAL.SaveTags(obj.ID, TagEntityType.article, obj.Tags);
                
return artcileid;
            }

            
catch (HibernateException ex)
            
{
                
if (null != tx) tx.Rollback();
                
throw new ApplicationException(ex.Message);
            }

            
finally { NHibernateHelper.CloseSession(); }
        }

SaveTags的定义:用到了SqlHelper类

internal static void SaveTags(int entityId, TagEntityType tet, string tags)
{
            SqlHelper.ExecuteNonQuery(SqlHelper.KyZhiSqlConn, CommandType.StoredProcedure, 
"ky_Tag_SaveTags",
                
new SqlParameter("@EntityId", entityId),
                
new SqlParameter("@EntityType", (int)tet),
                
new SqlParameter("@Tags", tags));
}
 
我怀疑是这样的地方引发了问题。
 
还有很多地方只用SqlHelper。
 
这样同时访问的人多了,就会出现事务错误
提问者:Hunts.C - 初学一级
最佳答案
NHibernate最好不要与SqlHelper混合使用,因为NHibernate内建了缓存机制, 可能产生脏读问题, 写入的时候也可能有一个延迟~~出问题的机率就大了~~可以使用数据库的存储过程来完成.
2008/7/9 9:14:09 回答者:沙加


提问者对于答案的评价:发现是Server2003 和SqlServer2005的一个bug。有个补丁却打不上去,不知道为什么。目前的解决方法是,出现错误,引导到500页面,在500页面做 System.Data.SqlClient.SqlConnection.ClearAllPools(); 操作
其它回答(2)
那一步事务提交为什么在SaveTags之前执行呀。
1个月前   回答者:玉开 - 大侠五级

1个月前   回答者:林间曦阳 - 小虾三级
评论
1个月前   Hunts.C :
to 沙加
SqlHelper 中使用的是存储过程。

to 玉开
没有为什么,因为我不知道在他之前之后是什么区别。 我只是现在return 之前 ?

希望大哥们多加提点啊 :(

   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关链接