oracle基础知识6_事务

 

0  SQL类型
a) DML(Data Manipulation Lanuage 数据操作语言): select insert update delete
b) DDL(Data Definition Language 数据定义语言): create/alter/drop/truncate table;

                                                                              create/drop view/sequence/index/synonym
c) DCL(Data Control Language 数据控制语言): commit rollback

 

 1 基础概念

 

delete 和 truncate的区别:

a) delete逐条删除, truncate先摧毁表,在按照原来结构重建

b) delete是DML类型操作(可以回滚) , truncate 是DDL类型操作(不可以回滚)

c) delete操作不会释放表空间,原来有数据时多大执行delete后还是多大, truncate会释放表空间

d) delete会产生碎片,truncate不会

 

 

事务:

 a) 起始于DML语句

 b) 结束于提交: 显示-->commit

                         隐式-->1 正常退出exit 2 DDL语句(默认自带隐式提交)

                 回滚: 显示-->rollback

                          隐式-->停电,宕机,非正常退出

 

 看如下示例,理解下回滚:

 

create table testsavepoint  (tid number,tname varchar2(20));

insert into testsavepoint values(1,'Tom');

insert into testsavepoint values(2,'Mary');

savepoint a;

insert into testsavepoint values(3,'Moke');

select * from testsavepoint;

得到记录:

  TID TNAME                                                                                                       
---------- --------------------                                                                                        
         1 Tom                                                                                                         
         2 Mary                                                                                                        
         3 Moke    

 

rollback to savepoint a;  回滚到设置点

select * from testsavepoint;

   TID TNAME                                                                                                       
---------- --------------------                                                                                        
         1 Tom                                                                                                         
         2 Mary  

commit;

 

 

 

 

事务隔离级别:

 

隔离级别 描述 问题
read uncommitted读未提交数据

允许事务读取未被其他事务提交的变更

 

脏读/不可重复读/幻读的问题都会出现

read committed读已提交数据 事务只能读取被其他事务提交的变更

避免了脏读

不可重复读/幻读会出现

repeatable read可重复读 确保事务可以多次从一个字段中读取相同数值,在这个事务持续期间,禁止其他事务对此字段进行更新

避免了脏读/不可重复读

幻读会出现

serializable 串行化 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对此字段进行插入,更新,删除

性能低下

规避了所有问题

 

 mysql支持以上所有隔离级别,默认的隔离级别为: repeatable read可重复读

oracle 支持2种离级别,read committed  和 serializable, 默认隔离级别为: read committed

 

 

 

事务分类两大类:

a) 本地事务 (常见开发中大多数都是本地事务)

eg:

try{

  扣费

  加费

  提交

}catch(Exception e){回滚}

b) 全局事务 (JTA: java transaction api  这套java技术支持全局事务)  

try{

  扣费

  加费

  发送短信/邮件 (非数据库业务)

  提交

}catch(Exception e){回滚}

你可能感兴趣的:(oracle基础)