【问题标题】:Sql inner query select between two transaction两个事务之间的Sql内部查询选择
【发布时间】:2015-02-25 03:45:36
【问题描述】:

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

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 数据库不阻止其他事务修改 查询读取的数据,该数据可以被其他人更改 查询的两次执行之间的事务。于是,一笔交易 两次运行给定查询可以同时经历不可重复读取 和幻影。)

对实现这一目标的最佳方法有什么建议吗?

【问题讨论】:

    标签: oracle oracle11g transactions isolation-level transaction-isolation


    【解决方案1】:

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

    一般来说,读取器不会阻塞写入器,写入器不会阻塞读取器。

    从文档中,

    事务级读取一致性

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

    阅读更多关于Data Concurrency and Consistency

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-01
      • 2012-03-12
      • 2013-02-11
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多