您的位置:首页 > 数据库

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

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

1

SqlConnection conn = new SqlConnection(strConn);
2

conn.Open();
3

SqlTransaction trans = conn.BeginTransaction();
4

try
5

{
6

CEngine.ExecuteNonQuery(trans,CommandType.Text,sql);
7

trans.Commit();
8

}
9

catch(SqlException ex)
10

{
11

trans.Rollback();
12

ErrorCode = ex.Number;
13

Info = "数据操作失败:" + ex.Message;
14

}
15

finally
16

{
17

trans.Dispose();
18

conn.Close();
19

}
20


21


22


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

开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。
后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:

1

SqlConnection conn = new SqlConnection(strConn);
2

conn.Open();
3

SqlTransaction trans = conn.BeginTransaction();
4

try
5

{
6

SqlCommand cmd = new SqlCommand();
7

cmd.CommandType = CommandType.Text;
8

//连接时限改为300秒
9

cmd.CommandTimeout = 300;
10

cmd.CommandText = sql;
11

cmd.Connection = conn;
12

cmd.Transaction = trans;
13

cmd.ExecuteNonQuery();
14

trans.Commit();
15

}
16

catch(SqlException ex)
17

{
18

trans.Rollback();
19

ErrorCode = ex.Number;
20

Info = "数据操作失败:" + ex.Message;
21

}
22

finally
23

{
24

trans.Dispose();
25

conn.Close();
26

}

修改后在测试,问题解决:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: