如何在.NET中实现事务(2)

并发问题

 

如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括: 丢失或覆盖更新,未确认的相关性(脏读),不一致的分析(非重复读),幻像读。但是如何来避免数据读取时脏读等问题出现呢?这里简单介绍一下:

SQL Server数据库中,提供四种隔离级别:未提交读、提交读、可重复读、可串行读。这四种隔离级别可以不同程度地保证并发的数据完整性: 

隔离级别

不可重复读取

未提交读

提交读

可重复读

可串行读

其中第二项为默认,而在.net框架中,同样支持事务的隔离级别。我们可以通过System.Data.IsolationLevel 来实现: public virtual IsolationLevel IsolationLevel {get;}

其成员及相应的含义如下: 

 

成员名称

说明

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



    显而意见,数据库的四个隔离级别在这里都有映射。在这里,SqlTransaction以及OleDbTransaction事务的 IsolationLevel 默认值为 ReadCommitted。那么我们如何使用呢? 可以使用下面方法实现:

trans = cnNorthwind.BeginTransaction( _
IsolationLevel.Serializable)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值