Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于数据库事务中不同隔离级别的一些澄清?_Sql_Oracle_Concurrency_Transactions_Isolation Level - Fatal编程技术网

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

Sql 关于数据库事务中不同隔离级别的一些澄清?,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表的锁定。 这里的结束

下面是从about
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持久层的方法。它们提供了一种机制来控制每个事务的“选择更新”。我相信当使用“较低”的事务类型时,这种方法将提供可序列化事务锁机制的好处。您确定“可重复读取”可能发生在具有“不可重复”隔离级别的事务中吗?在本文中,表格是不同的-