阿婆家的ORACLE事务大全

主要接触的数据库对象有:

存储过程:Procedures

触发器:Triggers

表:Tables

用户:User

索引:Indexes

视图:Views

序列:sequences

同义词:Synonyms

1.同义词学习
在oracle数据库中Synonyms,主要是给表,存储过程,触发器,视图等名别名
select * from SCOTT.EMP;//此处SCOTT.EMP可以创建一个同义词来代替
create synonym myemp for scott.emp;
select * from myemp;//此时myemp代表的就是scott.emp
drop synonym myemp;//删除同义词
注意事项:同义词要注意是拥有这个create synonym权限的用户才可以,dba拥有全部的权限
2.序列

在mysql里面,我们表字段中有一个auto_increment的字段,可以实现数据的自增长,oracle中却没有。
在oracle中序列的作用主要是生成连续的整数,常用在主键自增长中。(触发器)
(1)首先要创建序列
create sequence auto_incre
start with 1
increment by 1
nomaxvalue
minvalue 1
nocycle
nocache

select auto_incre.nextval from dual;
select auto_incre.currval from dual;
(2)在做插入操作的时候使用序列(这个序列对象是在该用户下共享的)
insert into dept values(auto_incre.nextval,'xx','china');
insert into student values(auto_incre.nextval,'zs',30,'男'); commit;rollback;
drop sequence auto_incre;
3.视图:一张表或者多张表的预定义查询(视图实际上是把基表的查询结果临时表重新命名别名),一般视图都是做查询操作
create view myselect
as
select * from dept;
//查询出在销售部的所有员工的姓名,工作,薪资
create view myselect3
as
select ename,job,sal from emp where deptno=(select deptno from dept where dname='SALES')
WITH READ ONLY
select * from myselect;
SELECT * FROM MYSELECT2;
好处:1.屏蔽性 2.安全性 3.降低了复杂性
DROP VIEW MYSELECT2;
4.索引:index-->相当于一本书里面的目录页(提高检索(查询)速度):算法tree hash

一张表: id name content age address score beizhu 能不能把这个表没有字段都变成索引项?

在mysql或者oracle中会默认把 primary key当初索引项,或者被unique修饰的字段,当成索引项
create index index_sname on student(sname);
注意:1.对经常被查询的列的数据可以使用索引提高速度,但是不是索引越多越好,因为增删改都会更新索引,会降低效率
2.使用unique修饰索引的时候要注意(区分情况,一般主键是唯一的)


5.触发器
oracle 使用触发器实现id自增
前提:存在数据库di_test,主键为id。
1.创建一个索引sequence
create sequence di_test_id
minvalue 1
nomaxvalue
start with 1
increment by 1
nocache;
2.创建一个触发器。在插入数据之前触发
create or replace trigger trigger_di_test_insert
before insert on di_test
for each row
declare
-- local variable here
begin
-- Column "ID" uses sequence di_test_id
select di_test_id.nextval into :new.ID from dual;
end trigger_di_test_insert;

触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。
即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。


事务(Transaction)

事务:

  事务是指作为单个逻辑工作单元执行的一组相关操作。  

  这些操作要求全部完成或者全部不完成。

银行转账:A--> B 5000 银行绝对不允许A没有转账成功,B却收到了转账







使用事务的原因:保证数据的安全有效。

事务的四个特点:(ACID)

  1、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。

  2、一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。

  3、隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。

  4、持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。

事务组成:

  一条或者多条DML,[一条DDL]和一条DCL。

事务的分类:

  1、显式事务:

    (1)要去显式的调用DCL。

    (2)只有用到COMMIT以后才会真正写入数据库,也持久化了。

  2、隐式事务:

    (1)如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)

    (2)以下情况为自动提交:

       1)正常执行完成的DDL语句:create、alter、drop

       2)正常执行完场的DCL语句GRANT、REVOKE

       3)正常退出的SQLPlus或者SQL Developer等客户端

回滚:

  RollBack只能对未提交的数据撤销,已经Commit的数据是无法撤销的,因为commit之后已经持久化到数据库中。

  

脏读(Dirty Read):事务T1更新了一行数据,还没有提交所做的修改,T2读取更新后的数据,T1回滚,T2读取的数据无效,这种数据称为脏读数据。

不可重复读(UNrepeatable Read):事务T1读取一行数据,T2修改了T1刚刚读取的记录,T1再次查询,发现与第一次读取的记录不相同,称为不可重复读。

幻读(Phantom Read):事务T1读取一条带WHERE条件的语句,返回结果集,T2插入一条新纪录,恰好也是T1的WHERE条件,T1再次查询,结果集中又看到T2的记录,新纪录就叫做幻读。

隔离级别:

  NO_TRANSACTION     不支持事务

  READ_UNCOMMITED    允许脏读、不可重复读、幻读

  READ_COMMITED     允许不可重复读、幻读,不允许脏读

  REPEATABLE       允许幻读,不允许脏读、不可重复读

  SERIALIZABLE       脏读、不可重复读、幻读都不允许

Oracle支持SQL92标准的READ_COMMITED、SERIALIZABLE,自身特有的READ_ONLY


锁:

排它锁:(X锁,eXclusive LockS)

  当有DML语句执行的时候,设计的行都会加上排它锁,其他事物不能进行读取修改。

共享锁:(S锁,Shared Locks)

  加了共享锁的数据,可以被其他事物读取,但不能修改。如select语句。

为了保证性能:乐观锁,悲观锁

  悲观锁:每次都是假设数据肯定会冲突,数据开始读取时就把数据给锁住。

  乐观锁:每次都是假设一般情况下不会发生数据冲突,只有数据更新提交的时候,才会对数据的冲突与否进行检测,如果发生冲突,返回错误信息让用户处理。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章