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        -             -                -
根据我的理解,最可靠的是Serializable然后是Repeatable Read然后Read Committed但我仍然看到了使用Read Committed的应用程序.这是因为Serializable和Repeatable Read的性能与Read Committed相比是不好的,因为在serializable中它将是顺序的,并且在事务必须等待另一个事务释放锁的情况下.对?因此,为了获得最佳效果,我们可以将隔离级别用作Read Committed with SELECT FOR UPDATE(以实现可重复读取).在读取提交的隔离级别的情况下,如果我们需要,我们不确定如何实现幻像读取?
Oracle不支持REPEATABLE READ隔离级别.但是,SQL Server会这样做 - 它会对事务选择的所有行进行锁定,直到它结束(即:它已提交或回滚).所以你是对的,这确实会使其他事务等待(如果他们正在更新锁定的数据)并且可能对并发性有害.
至于问题2:是的,隔离级别越高,并发事务将执行的越差,因为他们必须等待释放更多的锁.我不确定你通过使用"获得所有三个中最好的"是什么意思,SELECT FOR UPDATE因为它SELECT FOR UPDATE会在所有选定的行上放置行锁.
最后,这里引用了Oracle关于幻读的手册:
[幻像读取发生时]事务重新运行一个查询,返回满足搜索条件的一组行,并发现另一个已提交的事务已插入满足条件的其他行.
例如,事务查询员工数量.五分钟后,它执行相同的查询,但现在该数字增加了一个,因为另一个用户为新雇员插入了一条记录.更多数据满足查询标准,但与模糊读取不同,先前读取的数据不变.
参考:
SET TRANSACTION LEVEL (SQL Server)| 归档时间: | 
 | 
| 查看次数: | 2402 次 | 
| 最近记录: |