zoukankan      html  css  js  c++  java
  • 解决SqlTransaction用尽的问题

    解决SqlTransaction用尽的问题

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

    我做的一个项目,是负责一个厂的考勤的。厂里有员工1000多号人。按每人每天打4次卡,一个月30天,则产生的考勤记录数目为1000 * 4 * 30 = 120,000条。在处理这些记录时,我采用的办法是先生成SQL语句,然后执行这些SQL语句:

         SqlConnection conn = new SqlConnection(strConn);

       conn.Open();

       SqlTransaction trans = conn.BeginTransaction();

       try  

       {

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

          trans.Commit();

       }

       catch(SqlException ex)

       {

          trans.Rollback();

          ErrorCode = ex.Number;

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

       }

       finally

       {

          trans.Dispose();

          conn.Close();

           }

     

    但运行的时候却出错。错误提示为“SqlTransaction已经用完;它再也不能使用。

    开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。

    后来想到,数据库连接SqlConnection有个时间限制问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:

          SqlConnection conn = new SqlConnection(strConn);

          conn.Open();

          SqlTransaction trans = conn.BeginTransaction();

          try

          {

               SqlCommand cmd = new SqlCommand();

               cmd.CommandType = CommandType.Text;

               //连接时限改为300秒

               cmd.CommandTimeout = 300;

               cmd.CommandText = sql;

               cmd.Connection = conn;

               cmd.Transaction = trans;

              

               cmd.ExecuteNonQuery();

     

               trans.Commit();

            }

             catch(SqlException ex)

            {

               trans.Rollback();

               ErrorCode = ex.Number;

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

             }

             finally

            {

               trans.Dispose();

               conn.Close();

         }

    问题解决。

  • 相关阅读:
    CTS、CLS、CLR分别作何解释?
    C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
    net中读写数据库需要用到那些类?他们的作用?
    什么叫应用程序域?
    一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
    override与重载的区别
    请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    求以下表达式的值,写出您想到的一种或几种实现方法: 12+34+……+m
    什么是强类型系统?
    在下面的例子里
  • 原文地址:https://www.cnblogs.com/leftfist/p/4258389.html
Copyright © 2011-2022 走看看