SqlConnection Connection = new SqlConnection("server=.;uid=sa;pwd=1;database=dPnY;");
SqlCommand cmd1 = new SqlCommand();
SqlCommand cmd2 = new SqlCommand();
cmd1.Connection = Connection;
cmd2.Connection = Connection;
Connection.Open();
SqlTransaction sqlTran = Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
//SqlCommand cmd1 = Connection.CreateCommand();
//SqlCommand cmd2 = Connection.CreateCommand();
try
{
cmd1.CommandText = "insert into tBom (cMemo) Values('a')";
cmd1.Transaction = sqlTran;
cmd1.ExecuteNonQuery();
sqlTran.Commit();
//下面一句故意让其出错,让事务不能提交
int i = Convert.ToInt32("a");
cmd2.CommandText = "insert into tBom (cMemo) Values('b')";
cmd2.Transaction = sqlTran;
cmd2.ExecuteNonQuery();
sqlTran.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
sqlTran.Rollback();
}
finally
{
Connection.Close();
sqlTran.Dispose();
}
问题是:代码肯定没错,我在做一个很大的项目,所以要考虑很多并发性问题,组长说一定不能用分布式,上面的代码是我写的一段模拟代码,故意让事务卡主不能提交,我在执行上面代码时,在去数据库查询分析器查询,发现表被锁住了,System.Data.IsolationLevel.ReadUncommitted这个我已经让他可以读脏数据了,还是不行,回答好的话可以再加分的。。
根据你补充的, 修改了程序:
SqlConnection Connection = new
SqlConnection("server=YKZSHUAI-PC\\SQL2010;uid=sa;pwd=sa;database=dPnY;");
SqlCommand cmd1 = new SqlCommand();
SqlCommand cmd2 = new SqlCommand();
cmd1.Connection = Connection;
cmd2.Connection = Connection;
Connection.Open();
SqlTransaction sqlTran = Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
try
{
cmd1.CommandText = "insert into tBom (cMemo) Values(12)";
cmd1.Transaction = sqlTran;
cmd1.ExecuteNonQuery();
//sqlTran.Commit();
//读取脏数据
cmd2.CommandText = "select * from tBom";
cmd2.Transaction = sqlTran;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(dt);
//我把 cMemo 列改成 int,所以下面SQL语句会出错,事务不能提交。
cmd2.CommandText = "insert into tBom (cMemo) Values('f')";
cmd2.Transaction = sqlTran;
cmd2.ExecuteNonQuery();
sqlTran.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
sqlTran.Rollback();
}
finally
{
Connection.Close();
sqlTran.Dispose();
}
Console.Read();
中间读取的脏数据(刚刚插入的数据):
结论就是:你的程序可以读取脏数据,只是必须在程序中来读取、不能用查询分析器来读取、因为并未真正提交到数据库。
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务刚好访问到了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,
sqlTran.Commit();
//下面一句故意让其出错,让事务不能提交
int i = Convert.ToInt32("a");
你故意出错的上面一句,已经提交事务了。
楼主我有两个疑问。
1.为啥你同一个事务,第二个语句就没有执行,第一个insert后就马上commit了?那还怎么rollback?
2.如果是要读脏数据,select 后加with(nolock)这样行得通不?
sqlTran.Commit(); //这一句不应该有,应该放到最后。因为已经提交了。下面的错误怎么回滚上面已提交的操作呢?
//下面一句故意让其出错,让事务不能提交
int i = Convert.ToInt32("a");
TransactionOptions option = new TransactionOptions();
option.IsolationLevel =System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope=new TransactionScope(TransactionScopeOption.Required,option))
{
//提交事务处理
scope.Complete();
}
我用这个。