【问题标题】:How to keep self-joing from data inconsistence?如何防止自连接数据不一致?
【发布时间】:2021-11-05 22:17:53
【问题描述】:
在可重复读取中,我们可以保证从同一条记录中检索到相同的值,即使该记录被多次查询。但是,在定义视图时不允许设置隔离级别。目前,我正在尝试创建一个视图和 SQL 语句,如下所示SELECT * FROM TBL t1 INNER JOIN TBL t2 ON t1.SEQ = t2.SEQ + 1。
如您所见,我在一个会话中查询了一个表两次。这个查询可以很快,但我不能保证这两个查询之间这个表没有任何变化。如何在这种自联接中保持数据一致性?
【问题讨论】:
标签:
sql
oracle
transactions
self-join
isolation-level
【解决方案1】:
Oracle 会自动执行此操作。
来自documentation:
语句级读取一致性
Oracle 数据库始终强制执行语句级别的读取一致性,这保证了单个查询返回的数据在单个时间点被提交并保持一致。
单个 SQL 语句一致的时间点取决于事务隔离级别和查询的性质:
- 在读提交隔离级别中,该点是语句打开的时间。例如,如果
SELECT 语句在 SCN 1000 处打开,则此语句与 SCN 1000 一致。
- 在可序列化或只读事务中,这一点是事务开始的时间。例如,如果一个事务从 SCN 1000 开始,并且如果该事务中出现多个
SELECT 语句,则每个语句都与 SCN 1000 一致。
- 在闪回查询操作 (
SELECT ... AS OF) 中,SELECT 语句明确指定时间点。例如,您可以查询上周四下午 2 点出现的表格。