对数据库事务中不同隔离级别的一些澄清?

M S*_*ach 5 sql oracle concurrency transactions isolation-level

下面是从书面声明维基百科的文章隔离REPEATABLE READS

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

我的问题是交易何时开始和结束.

如果我们在同一个链接上采用REPEATABLE READS隔离级别的非可重复读取的示例,根据我的理解,当第一个查询被触发时,trnsaction 1开始,即SELECT * FROM users WHERE id = 1.DBMS将保持对users表的锁定,直到并且除非事务结束.这里通过结束 我的意思是,当连接会rolledback或完成不COMMITED 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        -             -                -
Run Code Online (Sandbox Code Playgroud)

根据我的理解,最可靠的是Serializable然后是Repeatable Read然后Read Committed但我仍然看到了使用Read Committed的应用程序.这是因为Serializable和Repeatable Read的性能与Read Committed相比是不好的,因为在serializable中它将是顺序的,并且在事务必须等待另一个事务释放锁的情况下.对?因此,为了获得最佳效果,我们可以将隔离级别用作Read Committed with SELECT FOR UPDATE(以实现可重复读取).在读取提交的隔离级别的情况下,如果我们需要,我们不确定如何实现幻像读取?

Nul*_*ion 6

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

至于问题2:是的,隔离级别越高,并发事务将执行的越差,因为他们必须等待释放更多的锁.我不确定你通过使用"获得所有三个中最好的"是什么意思,SELECT FOR UPDATE因为它SELECT FOR UPDATE会在所有选定的行上放置行锁.

最后,这里引用了Oracle关于幻读的手册:

[幻像读取发生时]事务重新运行一个查询,返回满足搜索条件的一组行,并发现另一个已提交的事务已插入满足条件的其他行.

例如,事务查询员工数量.五分钟后,它执行相同的查询,但现在该数字增加了一个,因为另一个用户为新雇员插入了一条记录.更多数据满足查询标准,但与模糊读取不同,先前读取的数据不变.


参考: