WEB开发网
开发学院数据库MSSQL Server 解决SqlTransaction用尽的问题(SQL处理超时) 阅读

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

 2007-11-11 12:48:26 来源:WEB开发网   
核心提示:有时候程序处理的数据量比较小时,四平八稳,解决SqlTransaction用尽的问题(SQL处理超时),一切安然无恙,但数据量一大,数据量大的时候,这个时间很可能就不够了,原先潜伏的问题就暴露无遗了,原访问数据库的代码为: 1SqlConnection conn = new SqlConnection(strConn)

有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
原访问数据库的代码为:
 1SqlConnection conn = new SqlConnection(strConn);
 2conn.Open();
 3SqlTransaction trans = conn.BeginTransaction();
 4try
 5{
 6   CEngine.ExecuteNonQuery(trans,CommandType.Text,sql);
 7   trans.Commit();
 8}
 9catch(SqlException ex)
10{
11   trans.Rollback();
12   ErrorCode = ex.Number;
13   Info = "数据操作失败:" + ex.Message;
14}
15finally
16{
17   trans.Dispose();
18   conn.Close();
19}
20
21
22
运行时,一旦出现数据量过大或者处理时间较长,则系统会提示出错。错误提示为“SqlTransaction已经用完;它再也不能使用。”

开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下sql server(WINDOWS平台上强大的数据库平台)的资料,未见提到内存的问题。
后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:
 1SqlConnection conn = new SqlConnection(strConn);
 2conn.Open();
 3SqlTransaction trans = conn.BeginTransaction();
 4try
 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}
16catch(SqlException ex)
17{
18   trans.Rollback();
19   ErrorCode = ex.Number;
20   Info = "数据操作失败:" + ex.Message;
21}
22finally
23{
24   trans.Dispose();
25   conn.Close();
26}
修改后在测试,问题解决:)

Tags:解决 SqlTransaction 用尽

编辑录入:coldstar [复制链接] [打 印]
赞助商链接