SqlDataReader上如何设置隔离级别?

cutesun 2010-04-19 03:26:45
执行Insert和Update的时候 这样设置隔离级别

conn.Open();
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try {
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlDelete, parms1);
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsert, parms2);
}
trans.Commit();
}
catch (Exception e) {
trans.Rollback();
throw new ApplicationException(e.Message);
}
finally {
conn.Close();
}

但是查询返回DataReader如何设置隔离级别?
原始代码如下:

SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connectionString);
try {
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch {
conn.Close();
throw;
}

因为只有查询语句 trans.Commit();trans.Rollback();放在里边是不是很奇怪?再说也不知道放在什么地方了。。
...全文
167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
皇城龙三 2010-04-22
  • 打赏
  • 举报
回复
ADO.NET中的事务隔离级别及设置

1 ReadUncommitted,可以进行脏读,即使一项操作未做完或未提交,其他操作也可以读取未提交的数据。

2 ReadCommitted,它是SQLServer的默认隔离级别,此级别可确保只有在第一个事务提交之后,第二个事务才能读取第一个事务操作后的数据,从而避免数据的脏读,增强了数据安全性。接着上面的例子:

using (SqlCommand cmd = new SqlCommand(selectStr, conn);)

{

conn.Open();

SqlTransaction ts = conn.BeginTransaction(IsolationLevel.ReadUncommitted);

cmd.Transaction = ts;

try

{

SqlDataReader dr = cmd.ExecuteReader();

Update();

while (dr.Read())

{

Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

dr = cmd.ExecuteReader();

while (dr.Read())

{

Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

trans.Commit();


3 RepeatableRead,这个级别扩展了ReadCommitted级别,即对正在访问的数据加上放置锁,其他操作将不能修改这些数据,确保数据的可重复读取,但是其他操作可以添加数据。

接着上面的例子:



SqlTransaction ts = conn.BeginTransaction(IsolationLevel. RepeatableRead);

cmd.Transaction = ts;

try

{

SqlDataReader dr = cmd.ExecuteReader();

Update();

Add();

while (dr.Read())

{



Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

dr = cmd.ExecuteReader();

while (dr.Read())

{



Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

trans.Commit();

4 Serilizable,这是最高的事务处理级别,它将阻止修改本事务所查询的数据的任何操作,由于对正在访问的数据加了额外的锁定,因此将会降低整个数据操作性能。由于Serilizable是最高级别,所以例子的结果很明确,将不再演示。

5 SnapShot,用快照思想确本事务中查询的数据的可重复读取性,若其他操作修改或添加了数据,本事务仍然从快照中获取数据。

SqlTransaction ts = conn.BeginTransaction(IsolationLevel. Snapshot);

cmd.Transaction = ts;

try

{

SqlDataReader dr = cmd.ExecuteReader();



Update();

while (dr.Read())

{



Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

dr = cmd.ExecuteReader();

while (dr.Read())

{

Console.WriteLine("{0},{1}", dr[0], dr[1]);

}

dr.Close();

trans.Commit();
cutesun 2010-04-22
  • 打赏
  • 举报
回复
顶一下
zhengbin215 2010-04-20
  • 打赏
  • 举报
回复
帮你顶一下
cutesun 2010-04-20
  • 打赏
  • 举报
回复
自己顶一下
a5520005 2010-04-20
  • 打赏
  • 举报
回复
帮你顶上去,看高人解答
cutesun 2010-04-19
  • 打赏
  • 举报
回复
没有人知道么?
lee_b 2010-04-19
  • 打赏
  • 举报
回复
,看不懂,顶下
fuchunjun 2010-04-19
  • 打赏
  • 举报
回复
路过回帖,帮顶。
whowhen21 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cutesun 的回复:]
我只是想执行SELECT之前,执行一下
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
是不是带上BeginTransaction()
就自动添加上 Begin Transaction 了?
[/Quote]
...
cutesun 2010-04-19
  • 打赏
  • 举报
回复
我只是想执行SELECT之前,执行一下
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
是不是带上BeginTransaction()
就自动添加上 Begin Transaction 了?
flyerwing 2010-04-19
  • 打赏
  • 举报
回复
看不懂 不过还是帮你顶起来
doo1314 2010-04-19
  • 打赏
  • 举报
回复
看不懂 不过还是帮你顶起来

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧