解决SqlTransaction用尽的问题(SQL处理超时)

有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
原访问数据库的代码为:
 1 None.gif SqlConnection conn  =  new SqlConnection(strConn);
 2 None.gifconn. Open ();
 3 None.gifSqlTransaction trans  =  conn.BeginTransaction();
 4 None.giftry
 5 None.gif{
 6 None.gif    CEngine.ExecuteNonQuery(trans,CommandType. Text ,sql);
 7 None.gif    trans. Commit ();
 8 None.gif}
 9 None.gifcatch(SqlException ex)
10 None.gif{
11 None.gif    trans. Rollback ();
12 None.gif    ErrorCode  =  ex. Number ;
13 None.gif    Info  =  "数据操作失败:"  +  ex.Message;
14 None.gif}
15 None.giffinally
16 None.gif{
17 None.gif    trans.Dispose();
18 None.gif    conn. Close ();
19 None.gif
20 None.gif
21 None.gif
22 None.gif

运行时,一旦出现数据量过大或者处理时间较长,则系统会提示 出错。错误提示为“ SqlTransaction 已经用完;它再也不能使用。

开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。
后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:
 1 None.gif SqlConnection conn  =  new SqlConnection(strConn);
 2 None.gifconn. Open ();
 3 None.gifSqlTransaction trans  =  conn.BeginTransaction();
 4 None.giftry
 5 None.gif{
 6 None.gif    SqlCommand cmd  =  new SqlCommand();
 7 None.gif    cmd.CommandType  =  CommandType. Text ;
 8 None.gif     // 连接时限改为300秒
 9 None.gif    cmd.CommandTimeout  =   300 ;
10 None.gif    cmd.CommandText  =  sql;
11 None.gif    cmd.Connection  =  conn;
12 None.gif    cmd. Transaction   =  trans;
13 None.gif    cmd.ExecuteNonQuery();
14 None.gif    trans. Commit ();
15 None.gif}
16 None.gifcatch(SqlException ex)
17 None.gif{
18 None.gif    trans. Rollback ();
19 None.gif    ErrorCode  =  ex. Number ;
20 None.gif    Info  =  "数据操作失败:"  +  ex.Message;
21 None.gif}
22 None.giffinally
23 None.gif{
24 None.gif    trans.Dispose();
25 None.gif    conn. Close ();
26 None.gif}

修改后在测试,问题解决:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值