首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库事务中不同隔离级别的说明?

数据库事务中不同隔离级别的说明?
EN

Stack Overflow用户
提问于 2011-09-14 18:39:30
回答 1查看 3.1K关注 0票数 5

下面是维基百科的孤立文章关于REPEATABLE READS的声明

在此隔离级别中,基于锁的并发控制DBMS实现将读取和写入锁(在所选数据上获取)保持到事务结束为止。但是,范围锁不被管理,因此可能会出现幻影读取现象(见下文)。

我这里的问题是事务是什么时候开始和结束的.

如果我们以同一链接上的不可重复读取和可重复读取隔离级别为例,根据我的理解,trnsaction 1在启动第一个查询时开始,即SELECT * FROM users WHERE id = 1.数据库管理系统将保持对users表的锁,直到事务结束为止。在这里,,我的意思是,当连接被回滚或执行时,而不是在SELECT * FROM users WHERE id = 1完成时。直到那个时候,交易2才会等待,对吗?

问题2 :-现在,如果我们考虑下面给出的隔离级别和它们的行为(在相同的链接上)

代码语言:javascript
复制
Isolation level     Dirty reads   Non-repeatable   Phantoms
Read Uncommitted    may occur     may occur        may occur
Read Committed      -             may occur        may occur
Repeatable Read     -             may occur        -
Serializable        -             -                -

根据我的理解,最可靠的是可序列化的,然后是可重复的读,然后是读提交,但我仍然看到aplications使用Read。因为可序列化和可重复读取的性能,所以与Read相比,读取是不好的,因为在串行化中,它将是顺序的,而且在事务发生时,必须等待另一个事务释放锁。对吗?,所以为了使这三种方法都达到最佳效果,我们可以使用与SELECT FOR UPDATE一起提交的隔离级别(以实现可重复读取)。如果需要,不确定如何实现幻影读取,如果需要的话?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-14 19:10:48

Oracle不支持REPEATABLE READ隔离级别。但是,SQL Server会这样做--它确实会对事务所选择的所有行设置锁,直到事务结束(即:它已提交或回滚)。因此,您是正确的,这确实会使其他事务等待(如果它们正在更新锁定的数据),并且可能会损害并发性。

至于问题2:是的,隔离级别越高,并发事务的执行情况就越差,因为它们必须等待更多锁的释放。我不知道您使用SELECT FOR UPDATE“充分利用这三种方法”是什么意思,因为SELECT FOR UPDATE会在所有选定的行上放置行锁。

最后,下面引用Oracle关于幻影的手册中的一句话:

当事务重新运行一个查询,返回满足搜索条件的一组行,并发现另一个已提交的事务插入了满足该条件的其他行时,就会发生幻影读取。 例如,事务查询员工的数量。五分钟后,它执行相同的查询,但由于另一个用户插入了新雇用的记录,这个数目现在增加了一个。与以前相比,更多的数据满足查询条件,但与模糊读取不同的是,先前读取的数据没有变化。

参考:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7421314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档