0

需要帮助理解两个事务之间的内部查询选择读取

UPDATE SER_NUMBERS SET SER_NUM = SER_NUM + 1 WHERE YEAR = 
(SELECT YEAR FROM (SELECT YEAR FROM SER_NUMBERS WHERE YEAR >= 1950
AND SER_NUM < 999 ORDER BY YEAR) WHERE ROWNUM =1)

每次执行查询时,我都会更新 SER_NUM = SER_NUM + 1,请求非常强烈,每秒可能有数千个请求。

问题是两个查询事务是否有机会从内部选择中读取相同的值并且两个事务更新相同的值?

有没有一种简单的方法可以让 Transaction-2 等待读取,直到 Transaction-1 完成更新?

正如我从 oracle 文档中看到的,默认隔离是已提交的读取

(Oracle 数据库不会阻止其他事务修改查询读取的数据,该数据可以在两次查询执行之间被其他事务更改。因此,运行给定查询两次的事务可能会遇到不可重复读取和幻像。 )

关于实现这一目标的最佳方法的任何建议?

4

1 回答 1

1

有没有一种简单的方法可以让 Transaction-2 等待读取,直到 Transaction-1 完成更新?

一般来说,Readers 不会阻止 writer,writer 不会阻止 reader。

从文档中,

事务级读取一致性

Oracle 数据库还提供了强制执行事务级读取一致性的选项。当事务以可序列化模式运行时,所有数据访问都反映了事务开始时数据库的状态。因此,同一事务中的所有查询看到的数据相对于单个时间点是一致的,除了由可序列化事务进行的查询确实看到事务本身所做的更改。事务级读取一致性产生可重复读取,并且不会将查询暴露给幻像。

阅读有关数据并发和一致性的更多信息

于 2015-02-25T05:00:42.580 回答