原文地址:http://blog.csdn.net/junmail/article/details/5556561

关于Oracle事务的总结

1.什么是事务,事务的特性是什么?

事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的。它的特性有四个:TOM总结为ACID即
原子性atomicity:语句级原子性,过程级原子性,事务级原子性
一致性consistency:状态一致,同一事务中不会有两种状态
隔离性isolation:事务间是互相分离的互不影响(这里可能也有自治事务)
持久性durability:事务提交了,那么状态就是永久的

对于语句级原子性,过程级原子性和事务级原子性可以查阅一下相关的信息

2.Oracle中的事务语句
commit=commit work 提交
rollback=rollback work 回滚
savepoint 事务的标记点,可以使一个事务在回滚到不同的阶段
set transaction  开始一个事务
rollback to savepoint 与savepoint对应
另外对于自治事务还有一个,下面会着重说一下关于自治事务
pragma autonomous_transaction

3.关于完整性约束与事务的关系
完整性约束的模式有immediate,deferred等
语法:set constraint c_fk defereed
这对于级联更新很有帮助,如下面的tom在书中举的例子:
SQL> create table p(pk int primary key);
表已创建。
SQL> create table c
  2  (fk constraint c_fk
  3  references p(pk)
  4  deferrable
  5  initially immediate
  6  )
  7  /
表已创建。
语句: set  constraint c_fk immediate;
      set  constraint c_fk deferred;
SQL> set constraint c_fk immediate;
约束条件已设置。
SQL> update p set pk=3;
update p set pk=3
*
ERROR 位于第 1 行:
ORA-02292: integrity constraint (FTITEM.C_FK) violated - child record found

SQL> set constraint c_fk deferred;
约束条件已设置。
SQL> update p set pk=3;
已更新 1 行。
SQL> update c set fk=3;
已更新 1 行。
SQL> commit;
提交完成。
SQL> set constraint c_fk immediate;
约束条件已设置。

4.在事务中两个不好的方法
tom在书上提到了两种不好的事务使用习惯,我在工作中也是经常犯的,主要是因为对于每种数据库的认识不到位,听好多朋友说数据库你只要会用了一个其它的就可以了,经过这段时间的学习,其实我们所说的会只是说对一SQL语句等,而并不是理解,比如对于临时表的用法,在sqlserver与oracle就不太一样(我只用过这两个数据库),两个不好的方法:
A:在循环中提交事务,这影响性能而且在快照(snapsot中也会有问题),还有一个是重新启动(在before update on table的触发器中会看到引用NEW,OLD会被触发两次)
B:使用自动提交事务,一定要手动控制事务的提交,因为自动提交会出现不必要的麻烦。

5.分布式事务
在oracle中会在一个事务中控制多个数据库,保证各个数据库中的数据完整性,主要通过dblink,看到这我想到了自己在工作中的问题:两台服务器不同的数据库,我一直认为不能同时用一个事务来控制,所以在开发程序中(我用delphi开发的)我用两个connection来进行联接不同的数据库,提交时分别提交,而且需要用状态标识来进行事务是否正常,之前用sqlserver时也这样操作,现在想想笨的要死,为什么没有用到事务的特性呢?究其原因是,自己对于数据库的理解差到极点了:(
在oracle中的分布式事务的限制条件:
(1)只能在主服务器中进行事务的开始,提交,回滚等,其它服务器会根据状态来进行判断,即主服务器为协调各个数据库的状态一致从而使其它从数据库达到状态一致。(应该说是站点,分站点)
(2)在dblink(数据链接)上不能做提交
(3)在dblink(数据链接)上不能做DDL操作
(4)在dblink(数据链接)不能发出savepoint等操作,即不能发出任何事务性语句

这里补充一下关于数据库链接的创建删除等语法:
创建数据链接:
方法1.create database link dblink_name connect to user_name identified by      
           password using 'server name';
方法2.create database link dblink_name  connect to user_name identified by    
           password
           using '(DESCRIPTION =
                          (ADDRESS_LIST =
                              (ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1521))
                           )
                          (CONNECT_DATA =
                               (SERVICE_NAME = orcl)
                          )
                        )';
删除数据链接:
drop database link dblink_name;
使用数据链接:
select * from table@dblink_name;

6.自制事务

几天前在pub论坛中看到一个问题是在表A上建了一个触发吕,当对表进行相关操作时不论成功或失败,都想通过触发器提交一些信息,(描述的有点不清,见谅),当时有人说用自治事务,我还寻思什么是自治事务呢?
自治事务:是独立于主事务的一个子事务,它的提交与回滚不影响主事务的操作(我的理解)
自治事务提供了一种用PL/SQL控制事务的新方法,可以用于:
1 顶层匿名块
2 本地,独立或打包的函数和过程
3 对像类型的方法
4 数据库触发器

自治事务存储过程:
SQL> create or replace procedure autonomous_insert
  2  as
  3  pragma autonomous_transaction;
  4  begin
  5  insert into t values('autonomous insert');
  6  commit;
  7  end;
  8  /

过程已创建。

pragma是一个编译器指令,这是一种编辑器执行某种编译选项的方法。

非自法事务存储过程:
SQL> create or replace procedure nonautonomous_insert
  2  as
  3  begin
  4    insert into t values('nonautonomous insert');
  5    commit;
  6  end;
  7  /

过程已创建。

SQL> begin
  2    insert into t values('anonymous block');
  3    nonautonomous_insert;
  4    rollback;
  5  end;
  6  /

PL/SQL 过程已成功完成。

SQL> select * from t;

MSG
-------------------------
anonymous block
nonautonomous insert

因为在nonautonomous_insert中有一个commit,所以rollback基本没有可回滚的操作。

SQL> begin
  2    insert into t values('anonymous block');
  3    autonomous_insert;
  4    rollback;
  5  end;
  6  /

PL/SQL 过程已成功完成。

SQL> select * from t;

MSG
-------------------------
autonomous insert

这是因为autonomous_insert是一个自治事务,独立于匿名块的事务,所以rollback不会影响到它。

如何使用一个自治事务来记录表修改的信息:创建五个audit表来记录信息
SQL> create table audit_tab
  2  (username varchar2(30) default user,
  3  timestamp date default sysdate,
  4  msg varchar2(4000)
  5  )
  6  /

表已创建。
在表emp中建立触发器(这就可以实现最初的那个问题)
create or replace trigger emp_audit
before update on emp
for each row
declare
  pragma autonomous_transaction;
  l_cnt number;
begin
  select count(*) into l_cnt from dual
  where exists (select null from emp
                where empno=:new.empno
                start with mgr=(select empno
                                  from emp
                                 where ename=user)
                connect by prior empno=mgr);
  if (l_cnt=0)
  then
    insert into audit_tab(msg)
    values('attemp to update '||:new.empno);
    commit;
  raise_application_error(-20001,'access denied');
  end if;
end;

总结:
1.事务应该尽可能的短,即避免不必要的扩大事务
2.根据需要事务足够大
3.决定事务大小的关键是数据完整性。
4.能决定事务大小的唯一约束就是控制系统的业务规则,不是undo,不是锁等。

转:oracle 事务的更多相关文章

  1. Oracle事务

    Oracle事务的ACID特性 原子性Atomicity:事务中的所有动作要么都发生,要么都不发生. 一致性Consistency:事务将数据库从一种状态转变为下一种一致状态. 隔离性Isolatio ...

  2. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  3. Oracle事务之一:锁和隔离

    Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...

  4. oracle事务和锁

    数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数 ...

  5. oracle事务和锁(转)

    If you use a SET TRANSACTION statement, then it must be the first statement in your transaction. How ...

  6. oracle事务(转)

    今天温习oracle事务,记录如下: 事务定义            事务是保持数据的一致性,它由相关的DDL或者DML语句做为载体,这组语句执行的结果要么一起成功,要么一起失败.        我们 ...

  7. oracle 事务 与 提交

    Oracle事务 一般事务(DML)即数据修改(增.删.改)的事务事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作.当事务被提交或回滚后,这些数据才会被 ...

  8. Oracle事务隔离级别处理差异

    Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZAB ...

  9. Oracle事务与锁

    Oracle事务与锁 2017-12-13 目录 1 数据库事务概括  1.1 事务定义  1.2 事务生命周期  1.3 事物的特性  1.4 死锁2 事务相关语句  2.1 事务相关语句概括  2 ...

随机推荐

  1. PostgreSQL执行超时的问题

    PostgreSQL执行超时的问题 使用背景 最近在使用PostgreSQL的时候,在执行一些数据库事务的时候,先后出现了statement timetout 和idle-in-transaction ...

  2. Python虚拟环境中pip install时没有权限问题

    virtualenv Permission denied 新建的python虚拟环境的目录的所属者必须是当前用户,才不会出现这种错误 比如 virtualenv py27 sudo chown zzf ...

  3. C#的Lambda表达式嵌套例子

    /* *curStatsResult是List<string>类型, *x.GetAllOsVersion()结果是string[]类型, *这里是先使用SelectMany()返回一个结 ...

  4. Nodejs学习笔记(十二)—定时任务(node-schedule)

    写在之前 在实际开发项目中,会遇到很多定时任务的工作.比如:定时导出某些数据.定时发送消息或邮件给用户.定时备份什么类型的文件等等 一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非 ...

  5. [PY3]——logging

    logging模块的logger.handler.filter.formatter Logger记录器 提供日志接口,供应用代码使用.logger最长用的操作有两类:配置和发送日志消息.可以通过log ...

  6. SpringMVC form 表单提交报400错误

    错误代码: HTTP Status 400 - type Status report message description The request sent by the client was sy ...

  7. 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP

    一.ISP简介(ISP--Interface Segregation Principle): 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代 ...

  8. 结合after使用content

    结合after或before伪类,在元素的开头或结尾附加上一定的内容,content:""的引号中即是添加的内容,比如说我们这么写: <div>学而时习之不亦说乎< ...

  9. 关于ajaxFileUpload只能上传一次的解决

    今天用ajaxFileUpload做了一个上传文件到服务器的功能. 出现问题:先上传了一次,后来发现读取完成以后,再上传的时候前台调试file和自动义参数都传进,但后台获取的仍然是上一次上传时的相关参 ...

  10. Jquery Easy UI初步学习(三)数据增删改

    第二篇只是学了加载用datagrid加载数据,数据的增删改还没有做,今天主要是解决这个问题了. 在做增删改前需要弹出对应窗口,这就需要了解一下EasyUi的弹窗控件. 摘自:http://philoo ...