学习笔记_oracle——事务管理

来源:互联网 发布:傲剑十八铜仁数据 编辑:程序博客网 时间:2024/05/16 07:25

事务
 1、是一种极致、一个操作序列,是数据库工作的逻辑单元
 2、有一个或多个完成一组相关行为的相关的SQL组成
 3、是一个不可分割的单元
 常用控制语句
  COMMIT  事务提交
  ROLLBACK 事务回滚
 特性 ACID
  原子性 事务是一个完整的操作,事务各步操作是不可分的
   要么都执行,套么都不执行
  一致性 事务操作前后,数据处于一致状态
   
  隔离性 对数据进行修改的所有事物彼此隔离的,事务
   必须是独立的,不依赖于或影响其他事务
   即,事务处理中,其他食物不能访
   问该事务的数据
   
   读取数据时的异常
   脏读  一个事物读取另一个失误未提交的数据
   不可重复读取 一个事物再次读取之前曾经读过的数据时
     发现该数据已经被另一个提交的事务更改
   幻读  一个事务根据相同的查询条件,重新自行
     查询,返回记录中包含的与前一次执行查
     询的记录不同的行
   
   事务隔离级别
   Read Uncommitted,oracle不支持
    保证不会读到非法数据
   Read Committed
    保证了一个事物不会读到另一个并发事务修改但未
    提交的数据
   Repeatable Read,oracle不支持
    此级别的事务隔离避免了了脏读和不可重复读的异常
    ,一个事务不可能更新已经由另一个失误读取但未提
    交的数据
   Serializable
    最高级别,三种全可以避免
   Read Only
    不能有任何修改数据库中数据的语句以及修改修改
    数据库结构的语句   
  持久性 事务完成后对数据库的修改永久保存

 应用
  BEGIN
   --执行语句
   COMMUT;
  EXCEPTION
   WHEN OTHERS THEN ROLLBACK
  END;
 使用
  事务开始
   oracle中不需要专门的语句。是隐式的,事务在修改数据的第一条语
   句处开始
  事务结束
   1、COMMIT和ROLLBACK提交或者回滚事务
   2、在DDL前面的DML,提交事务
   3、断开连接,自动提交
   4、用户进程意外终止,回滚
  事务控制语句
   COMMIT=COMMIT WORK  提交事务
   ROLLBACK=ROLLBACK WORK  回滚事务
   SAVEBACK   在事务中创建存储点
    SAVEPOINT [SavePoint_Name]
   ROLLBACK TO <SavePoint_Name> 将事务回滚到存储点
    ROLLBACK TO [SavePoint_Name]
   SET TRANSACTION   设置事务属性
    必须是事务的第一条语句
    可以设置的属性
     1、隔离级别  SET TRANSACTION + 隔离级别
     2、回滚使用的空间 
     3、事务命名  
   //==========SAVEBACK、ROLLBACK TO使用实例===============
   --数据库操作
   SAVEPOINT SavePoint_Name
   --希望回滚的操作
   COMMIT
   EXCEPTION
    WHEN others THEN
    ROLLBACK TO SavePoint_Name
   END

并发控制
 问题
  丢失更新: 一个事物修改数据时,另一个失误同时修改了改行的
    数据,使第一个更新修改丢失
  脏读:  一个事物读取另一个失误未提交的数据
  不可重复读取: 一个事物再次读取之前曾经读过的数据时
    发现该数据已经被另一个提交的事务更改
  幻读:  一个事务根据相同的查询条件,重新自行
     查询,返回记录中包含的与前一次执行查
     询的记录不同的行
 锁机制
  用来共享资源控制并发访问的一种机制
  1、由Oracle自动管理,所的持续时间是被提交事务处理的时间
  2、单用户数据库不需要锁机制 
 锁分类
  1、共享锁
   可以被其他事物读取,不能修改
  2、排他锁
   不能被其他事务读取和修改
  按保护的内容
  1、DML锁: 用来保护数据完整性
   行级锁(TX锁): 在事务发起第一个修改语句时,会得到TX锁,直到
     提交或者回滚
   表级锁(TM锁): 在一个会话修改表时自动获取,避免表结构的改变
  2、DDL锁:  用来保护数据对象结构的定义
   DDL执行时会先执行COMMIT,在执行后后执行COMMIT
  3、内部锁和闩 用来保护数据库内部结构
   
 常见问题
  1、死锁问题 两个事物进入等待对方锁定的资源时的停止状态
   解决 一个会话回滚,另一个事物继续执行
  2、阻塞问题 一个会话持有某个资源的锁,另一个请求这些资源
   解决 使用锁定
    锁定
    悲观锁 读取数据后马上锁定相关资源
     语法:SELECT... FOR UPDATE [OF column_list] [WAIT n|NOWAIT]
     OF字句用于指定即指定将更新的列,即锁定行上的待定列
     WAIT字句指定等待其他用户释放的秒数,防止无限制等待
     NOWAIT表示不等待

     指定读取数据后马上锁定相关资源
     SELECT... FOR UPDATE
     UPDATE...
     COMMIT;
     直到COMMIT才解锁
    乐观锁 
     把所有锁定都延迟到即将更新之前
     语法:利用update的where判断update时数据有无被更改
     UDPATE table SET key1 = newvalue1 where key2 = oldvalue2;

0 0