上图:(点击查看大图)
重点记住概念和特点就好,对于隔离级别用处不太大,不过面试的时候很有可能被问及,事务的特点中原子性没有做出解释,主要因为这是4个特点中最难理解的最抽象的一个,但是 原子性我们可以理解为:封装.意思就是说,整个事务的运行对外是不可见的,用户只能看到运行前的状态和运行后的状态.
今天的第2大块内容就是另人爱又怕的触发器,它比较像JAVA中的Filter类,在执行SQL语句时首先自动调用对应触发器,这很方便我们解决不少业务问题,但是一旦触发器使用较多,会使系统过于灵活而导致不可跟踪,不可维护,所以又要谨慎使用,具体概念如下:(点击查看大图)
触发器和存储过程的比较:
触发器 存储过程
编写 无参数,无返回值 都可以有,当然也可以没有
编写 不能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;