C# SqlServer隔离级别

  • 脏读

在脏读操作中,另一个事务可以读取在一个事务中改变的记录。因为在一个事务中改变的记录可能回滚到最初的状态,所以从另一个事务中读取这个临时状态就称为“脏读”——数据并没有提交。通过锁定要改变的记录,就可以避免这个问题。

  • 不可重复读​​​​​​​

当数据在事务中读取,而该事务运行的同时,另一个事务修改了相同的记录,此时,就会出现不可重复读操作。如果该记录在事务中读取多次,结果就会不同——不可重复复。锁定读取的记录,即可避免这个问题。

  • 幻读

​​​​​​​当读取一个范围内的数据,例如,使用WHERE子句读取时,就会出现幻读问题。在一个事务中读取这些记录时,另一个事务可以添加一个属于该范围的新纪录。用相同的WHERE子句再次读取这些记录,会返回数量不同的记录。幻读一般出现在更新一个范围的记录时。例如,UPDATE Address SET Zip=4711 WHERE Zip=2515会把所有记录的邮政编码从2515更新为4711。如果在更新过程中,另一个用户添加了一个邮政编码为2515的新记录,那么完成更新后,数据库将仍包含邮政编码为2515的记录。这个问题可以通过范围锁定来避免。

在定义隔离要求时,可以设置隔离级别。隔离级别用IsolationLevel枚举定义,在创建事务时,会配置该枚举(使用CommittableTransaction类的构造函数或者TransactionScope类的构造函数)。IsolationLevel枚举定义了锁定操作。

枚举值如下:

ReadUncommitted——事务不会相互隔离,使用这个级别,不等待其他事务释放锁定的记录。这样,就可以从其他事务中读取未提交的数据——脏读。这个级别通常仅用于读取不管是否读取临时修改都无关紧要的记录,如报表

ReadCommitted——等待其他事务释放对记录的写入锁定,不会出现脏读操作。这个级别为读取当前的记录设置读取锁定,为要写入的记录设置写入锁定,直到事务完成为止。对于要读取的一系列记录,在以移动到下一个记录上时,前一个记录都时未锁定的,可能出现不可重复读操作

RepeatableRead——为读取的记录设置锁定,知道事务完成为止,避免不可重复度问题,但幻读仍可能发生

Serializable——设置范围锁。设置范围锁定。在运行事务时,不可能添加于读取的数据位于同一个范围的新记录

Snapshot——用于对实际的数据建立快照。在复制修改的记录时,这个级别会减少锁定。这样,其他事务仍可以读取旧数据,而无须等待解锁

Unspecified——提供程序使用另一个隔离级别值,该值不同于IsolationLevel枚举定义的值

Chaos——类型于ReadUncommitted,不可锁定更新的记录

C#代码如下:

var option=new TransactionOptions
{
IsolationLevel=IsolationLevel.ReadUncommitted,
Timeout=TimeSpan.FromSeconds(90)
};
using(var scope=new TransactionScope(
TransactionScopeOption.Require,options))
{
//....
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值