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

解决SqlTransaction用尽的问题(SQL处理超时)有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。原访问数据库的代码为: 1SqlConnection conn = new SqlConnection(strConn); 2conn.Open(); 3SqlTransaction trans = conn.BeginTransaction(); 4try 5{ 6    CEngine.Exe…

大家好,又见面了,我是你们的朋友全栈君。

有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
原访问数据库的代码为:

 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}

修改后在测试,问题解决:)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145004.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号