Sql 关于数据库事务中不同隔离级别的一些澄清?
下面是从aboutSql 关于数据库事务中不同隔离级别的一些澄清?,sql,oracle,concurrency,transactions,isolation-level,Sql,Oracle,Concurrency,Transactions,Isolation Level,下面是从aboutREPEATABLE READS 在此隔离级别中,基于锁的并发控制DBMS实现保持读写锁(在选定数据上获取) 直到交易结束。但是,范围锁不受管理,因此可能会出现幻象读取现象(见下文) 我这里的问题是,交易何时开始和何时结束。 如果我们以不可重复读取为例,在同一链路上具有可重复读取隔离级别,根据我的理解,trnsaction 1 begin 当启动第一个查询时,即SELECT*FROM users,其中id=1。DBMS将在事务结束之前和之前保持对users表的锁定。 这里的结束
REPEATABLE READS
在此隔离级别中,基于锁的并发控制DBMS实现保持读写锁(在选定数据上获取)
直到交易结束。但是,范围锁不受管理,因此可能会出现幻象读取现象(见下文)
我这里的问题是,交易何时开始和何时结束。
如果我们以不可重复读取为例,在同一链路上具有可重复读取隔离级别,根据我的理解,trnsaction 1 begin
当启动第一个查询时,即SELECT*FROM users,其中id=1。
DBMS将在事务结束之前和之前保持对users表的锁定。
这里的结束我的意思是当连接被回滚或提交时,而不是在完成SELECT*FROM id=1的用户时。直到那时
事务2将等待,对吗
问题2:-现在,如果我们考虑隔离级别和下面给出的行为(在同一个链路上)
隔离级别脏读不可重复幻影
可能会发生未提交的读取
读取已提交-可能发生,也可能发生
可重复读取-可能发生-
可序列化---
据我所知,最可靠的是可串行化,然后是可重复读取,然后是读取提交,但我仍然看到了使用读取提交的应用程序。是因为
与提交的读取相比,可序列化和可重复读取的性能差,因为在可序列化中,它将是顺序的,并且在
的事务必须等待另一个事务释放锁对吗?因此,为了充分利用这三者,我们可以使用隔离 使用
选择更新(以实现可重复读取)。不确定在提交读取的情况下,如果需要,如何实现幻影读取
隔离级别?Oracle不支持可重复读取
隔离级别。但是,SQL Server会锁定事务选择的所有行,直到事务结束(即:提交或回滚)。因此,您是正确的,这确实会使其他事务等待(如果它们正在更新锁定的数据),并且可能对并发性有害
至于问题2:是的,隔离级别越高,并发事务的性能就越差,因为它们必须等待更多的锁被释放。我不知道您使用SELECT FOR UPDATE
来“充分利用这三个选项”是什么意思,因为SELECT FOR UPDATE
将在所有选定的行上放置行锁
最后,这里引用了Oracle关于幻影的手册:
[幻象读取发生在]事务重新运行查询,返回满足搜索条件的一组行,并发现另一个提交的事务插入了满足该条件的其他行
例如,事务查询员工数量。五分钟后,它执行相同的查询,但现在这个数字增加了一个,因为另一个用户插入了新员工的记录。满足查询条件的数据比以前多,但与模糊读取不同,以前读取的数据保持不变
参考资料:
- (甲骨文)
- (SQL Server)
“我不知道你说的“三者取其精华”是什么意思“基本上,我想问的是,如果我们在oracle中使用读取提交隔离级别,我们仍然会遇到不可重复和虚拟读取问题。对吗?根据我的理解,首先,我们不应该将它们称为问题,但这些应该被视为正确的行为,因为在第一个事务之间,如果第二个事务提交,那么我们应该得到更新的数据。对吗?继续…继续。。。第二个问题是,如果我们想通过oracle上提交的读取来避免不可重复和幻影读取问题,有什么办法吗?根据我的说法,如果我们使用select进行更新查询,我们可以从非重复读取中保存。coocrect?但不确定如何避免幻象读取?有关SELECT。。。对于更新
,为了充分利用这三种方法,我们可以使用隔离级别作为读取提交,并选择用于更新-这是像Datanucleus这样的JDO持久层的方法。它们提供了一种机制来控制每个事务的“选择更新”。我相信当使用“较低”的事务类型时,这种方法将提供可序列化事务锁机制的好处。您确定“可重复读取”可能发生在具有“不可重复”隔离级别的事务中吗?在本文中,表格是不同的-