下面是维基百科的孤立文章关于REPEATABLE READS的声明
在此隔离级别中,基于锁的并发控制DBMS实现将读取和写入锁(在所选数据上获取)保持到事务结束为止。但是,范围锁不被管理,因此可能会出现幻影读取现象(见下文)。
我这里的问题是事务是什么时候开始和结束的.
如果我们以同一链接上的不可重复读取和可重复读取隔离级别为例,根据我的理解,trnsaction 1在启动第一个查询时开始,即SELECT * FROM users WHERE id = 1.数据库管理系统将保持对users表的锁,直到事务结束为止。在这里,,,我的意思是,当连接被回滚或执行时,而不是在SELECT * FROM users WHERE id = 1完成时。直到那个时候,交易2才会等待,对吗?
问题2 :-现在,如果我们考虑下面给出的隔离级别和它们的行为(在相同的链接上)
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一起提交的隔离级别(以实现可重复读取)。如果需要,不确定如何实现幻影读取,如果需要的话?。
发布于 2011-09-14 19:10:48
Oracle不支持REPEATABLE READ隔离级别。但是,SQL Server会这样做--它确实会对事务所选择的所有行设置锁,直到事务结束(即:它已提交或回滚)。因此,您是正确的,这确实会使其他事务等待(如果它们正在更新锁定的数据),并且可能会损害并发性。
至于问题2:是的,隔离级别越高,并发事务的执行情况就越差,因为它们必须等待更多锁的释放。我不知道您使用SELECT FOR UPDATE“充分利用这三种方法”是什么意思,因为SELECT FOR UPDATE会在所有选定的行上放置行锁。
最后,下面引用Oracle关于幻影的手册中的一句话:
当事务重新运行一个查询,返回满足搜索条件的一组行,并发现另一个已提交的事务插入了满足该条件的其他行时,就会发生幻影读取。 例如,事务查询员工的数量。五分钟后,它执行相同的查询,但由于另一个用户插入了新雇用的记录,这个数目现在增加了一个。与以前相比,更多的数据满足查询条件,但与模糊读取不同的是,先前读取的数据没有变化。
参考:
SET TRANSACTION LEVEL ( Server)https://stackoverflow.com/questions/7421314
复制相似问题