小编use*_*874的帖子

Oracle:在可序列化事务中插入后立即选择

我最近遇到了一个奇怪的问题,在Oracle数据库中编程:在一个可序列化的事务中,我做了一个大量插入(INSERT ... SELECT),然后立即打开一个带有SELECT的变量表上的游标.我假设这个游标将包含新插入的行,但令我惊讶的是,它的内容不稳定,有时包括所有新插入的行,有时只包含一个子集.

我通过在打开光标之前提交解决了这个问题,但这种行为让我感到困惑.可以在同一事务中插入后进行选择,而不进行干预提交,实际上是否可信?或者这种行为是否与可序列化的事务有关?

后续:当我尝试创建一个可重现的测试用例时,我只能在添加索引后获得此行为(在这种情况下是主键索引,在实际代码中它是常规索引).也许问题在于构建索引所花费的时间,因此SELECT实际上使用不完整的索引来检索结果?无论如何,这是一个可重现的测试用例:

-- Create empty source table
CREATE TABLE TEST_CASE_1 AS 
  (SELECT 'CONTENT' AS CONTENT
   FROM DUAL
   WHERE 1 = 2)

-- Add primary key
ALTER TABLE TEST_CASE_1
ADD CONSTRAINT TEST_CASE_1_PK PRIMARY KEY (CONTENT);

-- Create empty destination table
CREATE TABLE TEST_CASE_2 AS 
  (SELECT 'CONTENT' AS CONTENT
   FROM DUAL
   WHERE 1 = 2)

-- Example of faulty code
BEGIN

  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

  -- Populate with 100.000 rows (I used ALL_OBJECTS but any source of …
Run Code Online (Sandbox Code Playgroud)

oracle select insert serializable

7
推荐指数
1
解决办法
2191
查看次数

标签 统计

insert ×1

oracle ×1

select ×1

serializable ×1