最近做个东西要用到事务,写了半天发现加上的事务没有办点用途,根本没有起作用。请DX们看看!
一个类:
public int Update(DataTable dt,string strSql,SqlTransaction myTrans)
{
SqlDataAdapter sda = new SqlDataAdapter(strSql,this.conn);
//命令生成器
SqlCommandBuilder scb = new SqlCommandBuilder(sda);

sda.SelectCommand.Transaction = myTrans;
sda.InsertCommand = scb.GetInsertCommand();
sda.UpdateCommand = scb.GetUpdateCommand();
sda.DeleteCommand = scb.GetDeleteCommand();//使用事务
sda.DeleteCommand.Transaction = myTrans;
sda.UpdateCommand.Transaction = myTrans;
sda.InsertCommand.Transaction = myTrans;
int ra = sda.Update(dt);
// 接受所有的修改
dt.AcceptChanges();
}
另一个类
myTrans = conn.BeginTransaction(IsolationLevel.Serializable);
CDA.Update(dsUpdate.Tables[tables[i]],"select * from " + tables[i],myTrans);
...
myTrans.Commit()
结果我发现,我在还没有Commit的时候,数据就已经插入到数据库里了?各位大侠有什么办法?让他在Commit的时候一次提交?

解决方案 »

  1.   

    楼上的数据库事务和COM+有什么关系?问题出在myTrans = conn.BeginTransaction(IsolationLevel.Serializable)上。
    根据你的不同需求取IsolationLevel不同的值。值:
    Chaos 
    受 .NET Framework 精简版的支持。
     无法改写隔离级别更高的事务中的挂起的更改。 16 
    ReadCommitted 
    受 .NET Framework 精简版的支持。
     在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 4096 
    ReadUncommitted 
    受 .NET Framework 精简版的支持。
     可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。 256 
    RepeatableRead 
    受 .NET Framework 精简版的支持。
     在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。 65536 
    Serializable 
    受 .NET Framework 精简版的支持。
     在 DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。 1048576 
    Unspecified 
    受 .NET Framework 精简版的支持。
     正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 -1 
      

  2.   

    我想在多次Update后,一次Commit,不允许脏读,用什么IsolationLevel?