Oracle学习笔记(五)——事务&触发器

上图:(点击查看大图)

      Oracle学习笔记(五)——事务&触发器

    重点记住概念和特点就好,对于隔离级别用处不太大,不过面试的时候很有可能被问及,事务的特点中原子性没有做出解释,主要因为这是4个特点中最难理解的最抽象的一个,但是原子性我们可以理解为:封装.意思就是说,整个事务的运行对外是不可见的,用户只能看到运行前的状态和运行后的状态.

    今天的第2大块内容就是另人爱又怕的触发器,它比较像JAVA中的Filter类,在执行SQL语句时首先自动调用对应触发器,这很方便我们解决不少业务问题,但是一旦触发器使用较多,会使系统过于灵活而导致不可跟踪,不可维护,所以又要谨慎使用,具体概念如下:(点击查看大图)

    Oracle学习笔记(五)——事务&触发器

触发器和存储过程的比较:

                 触发器                            存储过程

编写           无参数,无返回值                 都可以有,当然也可以没有

编写           不能commit或rollback                   可以

调用方式       事件发生时自动调用                  手工调用

操作对象       基于某一张表                        与表无关

 

补充:

  事务的实现机制:事务处理是通过日志文件实现的,当系统因意外重启时,系统会首先调用日志文件,日志文件中如果记录了事务的结束标志,则表示事务处理完成,如果日志文件中没有出现事务的结束标志,这时系统会将对应的事务反向执行一次,以回归到事务执行前的状态,相当于回滚.

 

每日一问:

   如何避免死锁?

 答:死锁是因为两个用户同用一个资源而产生的.

    解决的方法:指定访问共享资源的顺序.

 

   如何解决死锁?

 答:当用户不能查询或不能更新时,就可能发生了死锁

   解决方法:在一个死循环中检查系统的锁,如果发现死锁对象,则直接KILL掉!

 

每日一练:

  过滤器,目的是为了方便记忆:

CREATE OR REPLACE TRIGGER tr_autoid
BEFORE INSERT OR UPDATE OR DELETE ON t_t1
FOR EACH ROW
DECLARE
   num t_t1.t_id%TYPE;
BEGIN
    IF inserting THEN
         SELECT Max(t_t1.t_id) INTO num FROM t_t1;
         :NEW.t_id := nvl(num,0)+1;
    END IF;
    IF updating THEN
         :NEW.t_name := initcap(:NEW.t_name);
    END IF;
    IF deleting THEN
         IF :OLD.t_name='Lei' THEN
             raise_application_error(-20020,'该用户是超级用户,不能删!');
         END IF;
    END IF;
END;

<!-- -->

你可能感兴趣的:(oracle,sql,面试)