隔离级别

本文详细介绍了数据库事务的四种隔离级别:未提交读、已提交读、可重复读及可序列化,探讨了每种隔离级别如何影响并发副作用,如脏读、不可重复读和幻读。此外还介绍了SNAPSHOT隔离级别的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1定义编辑

事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事务进行的资源或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或虚拟读取)的角度进行描述。

2事务隔离级别控制以下各项编辑

读取数据时是否占用锁以及所请求的锁类型。
占用读取锁的时间。
引用其他事务修改的行的读取操作是否:
在该行上的排他锁被释放之前阻塞其他事务。
检索在启动语句或事务时存在的行的已提交版本。
读取未提交的数据修改。
选择事务隔离级别不影响为保护数据修改而获取的锁。事务总是在其修改的任何数据上获取排他锁并在事务完成之前持有该锁,不管为该事务设置了什么样的隔离级别。对于读取操作,事务隔离级别主要定义保护级别,以防受到其他事务所做更改的影响。
较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的 数量。相反,较高的隔离级别减少了用户可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性。应平衡应用程序的数据 完整性要求与每个隔离级别的开销,在此基础上选择相应的隔离级别。最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需 要通过执行某种级别的锁定来完成此操作,而锁定可能会影响多用户系统中的其他用户。最低隔离级别(未提交读)可以检索其他事务已经修改、但未提交的数据。 在未提交读中,所有并发副作用都可能发生,但因为没有读取锁定或版本控制,所以开销最少。
控制隔离数据以供一个进程使用并防止其它进程干扰的程度的 事务属性。设置隔离级别定义了 SQL Server 会话中所有 SELECT 语句的默认锁定行为。
当多个 事务 同时进行时,通过设置隔离级别来处理 脏读不可重复读幻读事件
read uncommitted | 0 未提交读
将查询的隔离级别指定为 0。
可以读 脏数据
读脏数据:一 事务对数据进行了增删改,但未提交,有可能 回滚,另一事务却读取了未提交的数据
read committed | 1 已提交读
将查询的隔离级别指定为 1。
避免 脏读,但可以出现 不可重复读幻读
不可重复读:一 事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致
幻像读:一 事务对数据进行了新增操作,另一事务两次查询的数据不一致
repeatable read | 2 可重复读
将查询的 事务隔离级别指定为 2。
避免 脏读, 不可重复读,允许幻像读
serializable | 3 可序列化
将查询的隔离级别指定为 3。
串行化读, 事务只能一个一个执行,避免了 脏读不可重复读、幻读
执行效率慢(我遇到过一种情况,用时是隔离级别1的30倍),使用时慎重
SNAPSHOT  
当读取数据时,可以保证读操作读取的行是 事务开始时可用的最后提交版本。
这意味着这种隔离级别可以保证读取的是已经提交过的数据,并且可以实现可重复读,
也能确保不会 幻读。不过这种隔离级别使用的不是 共享锁,而是行 版本控制
SQL Server 2005以后的版本支持。
下表显示了不同隔离级别允许的并发副作用。
隔离级别
脏读
不可重复读
虚拟读取
未提交读
已提交读
可重复读
快照
可序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值