【问题标题】:Demonstrate session isolation level in Oracle 11g演示 Oracle 11g 中的会话隔离级别
【发布时间】:2017-01-09 04:09:16
【问题描述】:

我正在写一篇展示 Oracle 11g 的花里胡哨的学期论文,但我很难展示锁定。我试图表明可以通过会话隔离级别防止“脏读”但我的示例代码似乎允许它们但我的第二个 SELECT 似乎看到了我的 INSERTed 行即使使用 SERIALIZABLE 隔离级别:

/* --------------- */
ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE;   
set transaction name 'gen_trx';
select count(*) from genres;
-- 135
insert into genres
VALUES (60,'Bar');
select count(*) from genres;
-- 136
COMMIT;
select count(*) from genres;
-- 136

我在这里错过了什么?

【问题讨论】:

  • Oracle 从不允许脏读。而且您发布的 sn-p 似乎没有进行任何脏读。 Oracle 不使用任何锁定来防止脏读,它使用多版本读一致性。您确定要讨论脏读而不是其他内容吗?
  • 谢谢,贾斯汀。不,我确定“脏读”是我的观点。我想我想要证明的是我可以控制隔离级别,并且我正在尝试提供一个简洁的示例来说明该控制。我的印象是 SERIALIZABLE 会在我的 SELECT 中隐藏我的 INSERT,直到我提交之后,但计数 (135,136,136) 表明情况并非如此。顺便说一句,一旦我解决了这个问题,我会清理这个问题以供后代和将来参考。
  • @Dan Dye:我不确定我是否理解正确,但是在插入语句之后,您当前的会话将能够看到您插入的值。此外,您正在交易关闭之前进行“选择”。也许你应该检查另一个会话。另一个会话中的选择将为您提供计数 135,一旦您在此处提交事务,计数将为 136。
  • 简而言之,使用 SERIALIZABLE,您将不会“看到”在您的事务开始后其他事务提交的更改。换句话说,您只能“看到”事务开始时提交的内容,以及事务所做的任何更改。为了证明这一点,您需要两个并发事务。

标签: sql oracle oracle11g locking isolation-level


【解决方案1】:

您当前的会话始终可以读取未提交的行,而无法从其他会话中读取未提交的行。 Oracle 不允许读取未提交的事务read more

要对其进行测试,您必须在没有提交的情况下在两个不同的会话中运行您的代码。

因为如果 Oracle 确实允许脏读,那么当并行会话进行未提交的条目时,您应该获得超过 136 行。

您将找到有关 Oracle 11g 事务隔离级别here的更多信息

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 2014-10-05
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2014-08-28
    • 2014-02-10
    相关资源
    最近更新 更多