公司封装了操作数据库的DAL类库,可是在项目中总是会出现如下的错误:
1. The server failed to resume the transaction. Desc:540000098d.
2. The transaction active in this session has been committed or aborted by another session.
3. New request is not allowed to start because it should come with valid transaction descriptor
4. Cannot find table 0.(这个错误最近没了)
还有个问题就是为什么这些错误不是经常发生,而是到一定时间或者次数之后才发生,真是费解啊!
这些在网上找了很多,可是就没有找到合适的答案,也很仔细的看了源码,只怪自己功力不够,没有找出问题的根本原因!
希望能得到热心园友帮忙,如果有需要我可以给你看源码!
hi , 2楼和3楼可能都说到点子上了。我查了下google 发现有人用ef的时候也碰到类似问题,结果是Context没有使用静态导致。所以我担心你那类库或者你使用的时候是否是唯一对象或者是是否没用静态对象?或者用单例也行,但是要保证多线程单列
大哥,能荣幸加一下你的MSN吗!:-)
@程序猿就是我: 我回家加你把,今天可能比较忙
@逆时针の风: 我的MSN :ycg166911@163.com
@程序猿就是我: 我不大上msn的你加我q 332829544
@程序猿就是我:
我大致看了下源码,发现DBEngine类没有考虑到并发而且全局事务变量mobjTrn可能会被其他线程篡改,可以尝试,可能DBEngine部分方法要改,例如关于事务的几个方法和全局变量都要改,可以参考一下http://kb.cnblogs.com/page/127650/文章或者可以参考下异步事务http://www.cnblogs.com/wang726zq/archive/2012/05/17/Transaction1.html
@逆时针の风:
大哥你说的很有道理,看了你推荐的文章,有点头绪, 虽然要知道修改什么了,可是不知道要怎么修改!
还请大哥进一步指教呀!
@程序猿就是我:
项目中使用的是WCF服务,而且还有多线程,我想这是出现这些原因的导火线!
@程序猿就是我:
还有一种方法你可以尝试下,DBEngine类中的全局静态事务对象用[ThreadStatic]打上标签
Cannot find table 0?这个可能是没数据导致的。程序那边没作判断处理。
看到事务错误,我估计你们的代码没控制好事务和连接的关系。
有空帮我看看源码吗?求助
@程序猿就是我: 非常抱歉,没有时间帮你看源码。你可以先把SqlTransaction和SqlConnection的关系和作用范围搞清楚后再去浏览你们的代码。
检查一下连接数据库的时候是不是采用了静态方法
我在写数据库类库类库的时候,可以使用单列模式吗?
看看是不是发生这种情况:
DbConnection conn1,conn2;
DbTransaction tranOfconn1 = conn1.BeginTransaction()
DbCommand cmdOfConn2; cmdOfConn2.Connection = conn2;
cmdOfConn2.Transaction = tranOfconn1;//!!!!
cmdOfConn2.ExecuteNoneQuery();//Error:2. The transaction active in this session has been committed or aborted by another session.
上面的情况是没有的的,大哥如果有空的话,可以帮小弟看下源码,谢谢!
看起来项目很大,你用的是英文版的吗??
你说的VS是英文版吗?项目不算太大,大哥对于上面的几个错误问题,有什么建议可以给我的吗?
求指教!
求助!