首页 > 编程 > .NET > 正文

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

2024-07-10 13:05:17
字体:
来源:转载
供稿:网友
并发问题



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

在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)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表