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();放在里边是不是很奇怪?再说也不知道放在什么地方了。。
...全文
293 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
  • 打赏
  • 举报
回复
看不懂 不过还是帮你顶起来
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...

111,128

社区成员

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

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

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