zoukankan      html  css  js  c++  java
  • [转]oracle中使用set transaction设置事务属性

    本文转自:http://yedward.net/?id=24

    set transaction语句允许开始一个只读或者只写的事务,建立隔离级别或者是为当前的事务分配一个特定的回滚段。需要注意的是,set transaction必须是事务处理中的第一条语句,注意是事务处理的第一条语句,不是指代码的第一条语句,并且set transaction在一个事务中只能出现一次。

    set transaction的语法如下:

    SET TRANSACTION parameter;

    parameter是用来指定参数的,其可用参数有如下几种类型:

    (1)read only:表示建立只读事务,在此事务中只有select、select into、open、fetch、close、lock table、commit、rollback语句才允许出现,不可以执行insert、update、select for update等非法操作,对于这种事务模式不用指定回滚段。

    (2)read write:建立读写事务,该事务既可读、也可写,oracle默认的事务就是这种类型。

    (3)isolation level:用来设置事务的隔离级别,可以设置为serializable和read committed这两个选项。serializable会使得对已经修改但没有提交的数据对象的DML事务失败;read committed会使得对已经修改但没有提交的数据库对象的DML事务在进行修改时,会等待先前DML锁释放,这也是oracle默认的事务的隔离级别。

    可以使用use rollback segment给事务定义一个合适的回滚段,如下例子:

    SET TRANSACTION ISOLATION USE ROLLBACK SEGMENT segmentname;

    一般在做报表查询的时候,可以先设置该查询事务为一个只读事务,以避免出现写操作,可以看下面这样的一个例子:

    DECLARE
      l_name VARCHAR2(100);
      l_age  NUMBER;
      l_sex  VARCHAR2(2);
    BEGIN
      -- 为保证set transaction是事务的第一条语句,先使用commit或rollback来结束掉前面可能存在的事务
      COMMIT;
      -- 使用name给事务命名
      SET TRANSACTION READ ONLY NAME '查询报表';
      SELECT NAME
        INTO l_name
        FROM student
       WHERE student_id = 1001;
      SELECT age
        INTO l_age
        FROM student
       WHERE student_id = 1001;
      SELECT sex
        INTO l_sex
        FROM student
       WHERE student_id = 1001;
      -- 终止只读事务
      COMMIT;
      dbms_output.put_line('输出:' || l_name || l_age || l_sex);
    END;
  • 相关阅读:
    关于课内外读物的建议
    c# Aes加解密
    web api 如何通过接收文件流的方式,接收客户端及前端上传的文件
    c# 文件夹权限
    mysql 8创建远程访问用户以及连接mysql速度慢的解决方法
    为什么读书?读书让我们明心见性!
    大部分教程不会告诉你的 12 个 JS 技巧
    nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)
    Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本
    eos的资源和工具列表
  • 原文地址:https://www.cnblogs.com/freeliver54/p/6049590.html
Copyright © 2011-2022 走看看