【发布时间】: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