以下是Wikipedia's Isolation article关于REPEATABLE READS
在此隔离级别中,基于锁的并发控制DBMS实现保持读写锁定(在选定数据上获取) 直到交易结束。但是,范围锁定不受管理,因此可能会出现幻像读取现象(见下文)。
我的问题是交易何时开始和结束。
如果我们以同一链接上的REPEATABLE READS隔离级别的非可重复读取为例,根据我的理解,trnsaction 1开始
当第一个查询被解雇时,SELECT * FROM users WHERE id = 1.
DBMS将保持对用户表的锁定,直到并且除非事务结束。
这里结束我的意思是当连接在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 - - -
根据我的理解,最可靠的是Serializable然后是Repeatable Read然后Read Committed但我仍然看到了使用Read Committed的应用程序。是因为
Serializable和Repeatable Read的性能与Read Committed相比是不好的,因为在serializable中它将是顺序的,以防万一
事务必须等待另一个事务释放锁。 对吗?为了获得最好的三个,我们可以使用隔离
使用SELECT FOR UPDATE
读取提交的级别(以实现可重复读取)。如果我们想要,我们不知道如何实现幻读,如果是读取提交的话
隔离级别?
答案 0 :(得分:6)
Oracle不支持REPEATABLE READ
隔离级别。但是,SQL Server会这样做 - 它会对事务选择的所有行进行锁定,直到它结束(即:它已提交或回滚)。所以你是对的,这确实会使其他事务等待(如果他们正在更新锁定的数据)并且可能对并发性有害。
至于问题2:是的,隔离级别越高,并发事务执行的越差,因为他们必须等待释放更多的锁。我不确定使用SELECT FOR UPDATE
“充分利用所有三个”是什么意思,因为SELECT FOR UPDATE
会在所有选定的行上放置行锁。
最后,这里引用了Oracle关于幻读的手册:
当一个事务重新运行一个返回满足搜索条件的行的查询并发现另一个已提交的事务已插入满足条件的其他行时,会发生[幻像读取]。
例如,交易查询员工数量。五分钟后,它执行相同的查询,但现在该数字增加了一个,因为另一个用户为新雇员插入了一条记录。更多数据满足查询标准,但与模糊读取不同,先前读取的数据不变。
<强>参考:强>
SET TRANSACTION LEVEL
(SQL Server)