用Connection.BeginTransaction(IsolationLevel)来实现

解决方案 »

  1.   

    IsolationLevel 枚举类型:
    [Chaos]受 .NET Framework 精简版的支持。 无法改写隔离级别更高的事务中的挂起的更改。 
    [ReadCommitted] 受 .NET Framework 精简版的支持。 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 4096 
    [ReadUncommitted] 受 .NET Framework 精简版的支持。 可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
    [RepeatableRead] 受 .NET Framework 精简版的支持。 在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
    [Serializable] 受 .NET Framework 精简版的支持。 在 DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。 
    [Unspecified] 受 .NET Framework 精简版的支持。 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。  ----0-----0-----
    高举学习的旗帜学习
      

  2.   

    在事务中对表使用with (TABLOCKX)锁定表
    ----------------
    SqlTransaction cmicTr=tempCn.BeginTransaction();//开始事务
    try
    {
    SqlDataAdapter cmicDa=new SqlDataAdapter("select * from MetalMemberBasic " +
    " where State=0",tempCn);
    //where state='0'作用是取出记录数为零的
    DataTable cmicDt=new DataTable();
    cmicDa.SelectCommand.Transaction=cmicTr;
    cmicDa.Fill(cmicDt); DataRow cmicDr=cmicDt.NewRow();
    SqlCommand cmicCmd=new SqlCommand("select max(MaxMemberID)"
    +" from MetalMaxID with (TABLOCKX)",tempCn);//锁定表取最大值
    cmicCmd.Transaction=cmicTr;
    int maxID = Convert.ToInt16((cmicCmd.ExecuteScalar() == DBNull.Value)?0:cmicCmd.ExecuteScalar());
    tempID=++maxID;//获取会员最大流水号

    cmicCmd=new SqlCommand("Update MetalMaxID set " +
    "MaxMemberID=@MaxMemberID",tempCn);
    cmicCmd.Parameters.Add(new SqlParameter("@MaxMemberID",SqlDbType.Int));
    cmicCmd.Parameters[0].Value=maxID;
    cmicCmd.Transaction=cmicTr;
    cmicCmd.ExecuteNonQuery(); cmicDr[0]=maxID;
    cmicDr[1]=tempName;
    cmicDr[2]=tempAcronym;
    cmicDr[3]=tempAdress;
    cmicDr[4]=tempPostCode;
    cmicDr[5]=tempRelation;
    cmicDr[6]=tempTelephoneArea;
    cmicDr[7]=tempTelephone;
    cmicDr[8]=tempFax;
    cmicDr[9]=tempMobile;
    cmicDr[10]=tempBusinessAdress;
    cmicDr[11]=tempBusinessID;
    cmicDr[12]=tempMemberDate;
    cmicDr[13]=tempPersonID;
    cmicDr[14]=tempState;
    cmicDr[15]=tempNote;
    cmicDr[16]=tempUpDateTime;
    cmicDr[17]=tempOperator;

    cmicDt.Rows.Add(cmicDr);
    //更新数据库数据
    SqlCommandBuilder cmicCb=new SqlCommandBuilder(cmicDa);
    cmicDa.Update(cmicDt);
    //卸载资源
    cmicCmd.Dispose();
    cmicCb.Dispose();
    cmicDt.Dispose();
    cmicDa.Dispose();
    }
    catch(Exception ex)
    {
    tempErrorMessage=ex.Message;
    cmicTr.Rollback();
    return false;
    }
    cmicTr.Commit();