应当是
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
select * from master;
select * from detail1;
select * from detail2;
...
select * from detailn;COMMIT;

解决方案 »

  1.   

    我想的是:LOCK TABLE tables IN SHARE MODE;用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;能保证吗?
    我在发出select * from master; 的时候,有可能其他transaction 修改了detail表。“SERIALIZABLE specifies serializable transaction isolation mode as defined in SQL92.
    If a serializable transaction contains data manipulation language
    (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, then the DML statement fails.”这里所说的是serializable transaction 包含的DML语句如果要修改另一个未提交的serializable transaction中的内容时,会失败。
    但此处我的select 事务并不涉及DML。
      

  2.   

    这是你的不对了
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    能保证所有查询表的scn一致性.
    如果你在发出select * from master; 的时候,有可能其他transaction 修改了detail表。那么查询detail表的时候,是更新前的数据.当然,如果查询时间太长,可能会有快照太旧的异常,那是因为回滚段太小,而别的session更新了查询表引起的.
    你的方法显然就不好了.如果查询时间太长,那你是把所有的表都锁住了,还让别人工作不工作?
      

  3.   

    to penitent:
    我的想法:在select之前,先lock 所有要select的表,然后发出select命令,之后再rollback 释放锁,后面我再对select所得到的游标进行数据操作。对于
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    能保证所有查询表的scn一致性.
    我还不是很明白,能进一步说明一下吗?
      

  4.   

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    能保证一致的。
    你先发以上命令。
    再select table1
    select table2
    最后commit
    如果你在select 之前lock表,你怎么琐,一个一个锁,还是有时间差的,这个时间内表有修改你怎么办。
    还有lock表后,别人都不能再写表了。有很大的局限性
      

  5.   

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 确实可以。
    oracle 提供三种isolation levels:read committed, serializable transactions, read-only。
    "Serializable transactions see only those changes that were
    committed at the time the transaction began, plus those
    changes made by the transaction itself through INSERT,
    UPDATE, and DELETE statements. Serializable transactions
    do not experience nonrepeatable reads or phantoms."我想使用lock的想法是同时lock所有要select 的表,然后发出select命令,再commit,之后慢慢fetch 数据。
    使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 可能更好些。
    不过我前面想问的是(有点困惑),就是lock的话,只会锁住我所要select的几张表,而如果是设置事务的话,要考虑对数据库中所有的表有影响,也就是说其他事务对不是我所需要select的表操作时,也会存在影响。当然不管那一种方式,我的想法都是在select之后都进行commit,释放锁或结束事务的SERIALIZABLE 特性。(这时应该可以保证几张表的数据所取都时同一时间点了)
    但之后长时间的fetch数据,可能都会造成snapshot too old的错误。不知penitent有没有好的想法?
      

  6.   

    snapshot too old是谁也不能保证的,
    你需要多建立回滚段。