关于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事物的工作流程,首先先解释几个小概念:       1.undo段的组成:段头.回滚块       2.事物ID:每一个事物都有一个自己的事物ID,就像身份证号一样. 在v$tra ...

  2. Oracle事物处理

    n  什么是事物 事物是把对数据库的一系列操作(dml)看做一个整体 事物用于保证数据的一致性,它由一组相关的dml语句组成,改组的dml语句要么全部成功,要么全部失败. 如:网上转账就是典型的要用事 ...

  3. Oracle事物基础

    事务 1 事务定义 数据库事务是SQL语句的组合作为一个"工作单元".要么全部完成,要么全部不做. 每个事务都有一个开始和一个结束. 2 事务开始 1. 你连接到数据库并执行DML ...

  4. Oracle在Java中事物管理

    对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...

  5. oracle 笔记

    1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...

  6. Oracle中事务处理控制用法

    oracle 事物控制包括 COMMINT ROLLBACK SAVEPOINT avepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepo ...

  7. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...

  8. java面试---summay

    1:合适的建立索引,数据量比较大的时候,如果频繁的进行修改插入则不建议建立索引! 2:什么时候适合建索引,在什么字段上面建立索引? (被当做查询条件的) 3:什么叫做编译错误,什么叫做运行时异常 能被 ...

  9. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

随机推荐

  1. 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式

    1. 一个错误释放内存的例子 下面的场景会有什么错? std::]; ... delete stringArray 一切看上去都是有序的.new匹配了一个delete.但有一些地方确实是错了.程序的行 ...

  2. JS中函数参数和函数返回值的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  3. c# 读取app.config遇到生成X.config.config问题

    string exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "WindowsFormsApp.exe" ...

  4. POJ 2989 All Friends 极大团计数

    POJ 2989 题意:给定一个无向图(节点数小于128)求极大团(不包含在更大的团中)的总数. 对最大团,极大团不熟悉的,建议先阅读最大团搜索问题 ZOJ 1492 再来看本题. 本题数据有限,可以 ...

  5. wpf的无边框窗体透明

    本人做了3年的winform,来了新的工作,需要使用wpf.对于wpf,本人小白一个.说的不对的地方,请大家多多指导.... 今天先从wpf的窗体属性开始说起! 需要做的项目功能大概和电脑桌面类似,需 ...

  6. JavaScript代码规范和性能整理

    性能 Js在性能方面有多要注意的地方: 避免全局查找 Js性能优化最重要的就是注意全局查找,因为作用域的查找是先找局部作用域在没有找到之后在去上一级作用域查找直到全局作用域,所以全局作用域查找的性能消 ...

  7. wemall app商城源码Android短信监听接收器

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  8. UIImagePickerController拍照/相册/录像/本地视频

    1.导入系统库 #import <MobileCoreServices/MobileCoreServices.h> 2.遵守协议 <UIImagePickerControllerDe ...

  9. 476. Number Complement

    题目 Given a positive integer, output its complement number. The complement strategy is to flip the bi ...

  10. 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型

    MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...