OREACLE-03事务、建表、索引
1、oreacle事务 可以提交的成功和失败,以下四种情况保证事务的提交与回滚。
事务的结束 1、正常的commit(使数据修改生效)或者rollback(将数据恢复到上一个状态) 2、自动提交,但是一般情况下要将自动提交进行关闭,效率太低 3、用户关闭会话之后,会自动提交事务 4、系统崩溃或者断电的时候回回滚事务,也就是将数据恢复到上一个状态
2、事务用保存点的使用,最后也需要commit
delete from emp where empno = 1111; delete from emp where empno = 2222; savepoint sp1; delete from emp where empno = 1234; rollback to sp1; commit;
3、事务的四个特性
事务的四个特性:ACID
原子性:表示不可分割,一个操作集合要么全部成功,要么全部失败,不可以从中间做切分
一致性:最终是为了保证数据的一致性,当经过N多个操作之后,数据的状态不会改变(转账)
从一个一致性状态到另一个一致性状态,也就是数据不可以发生错乱
隔离性:各个事务之间相关不会产生影响,(隔离级别)
严格的隔离性会导致效率降低,在某些情况下为了提高程序的执行效率,需要降低隔离的级别
隔离级别:
读未提交
读已提交
可重复读
序列化
数据不一致的问题:
脏读
不可重复读
幻读
持久性:所有数据的修改都必须要持久化到存储介质中,不会因为应用程序的关闭而导致数据丢失
四个特性中,哪个是最关键的?
所有的特性中都是为了保证数据的一致性,所以一致性是最终的追求
事务中的一致性是通过原子性、隔离性、持久性来保证的
4、事务中数据的状态。



5、事务中数据的锁粒度。数据库,表锁,行锁。肯定多的粒度越小越好。
6、mysql中事务测试
1、首先关闭自动提交。查询:select @@autocommit; 设置不自动提交:set autocommit = 0;
2、事务隔离级别的测试:
--事务包含四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全 read uncommitted; --读未提交 read commited; --读已提交 repeatable read; --可重复读 (seariable) --序列化执行,串行执行 --产生数据不一致的情况: 脏读 不可重复读 幻读 ``` | 隔离级别 | 异常情况 | | 异常情况 | | -------- | -------- | ---------- | -------- | | 读未提交 | 脏读 | 不可重复读 | 幻读 | | 读已提交 | | 不可重复读 | 幻读 | | 可重复读 | | | 幻读 | | 序列化 | | | |
1、开启事务:start transaction;
2、设置事务的隔离级别:set session transaction isolation level read uncommitted;
3、隔离的影响归纳:
1、脏读就是第一个会话修改的数据还没有提交,第二个会话已经查询出来了没有提交的数据
2、不可重复读是:第一个会话修改的数据提交了。第二个会话同一个事务中查询出来的数据不一致。(在同一个事务中要确保读到的数据一致性)
3、幻读是:因为事务是行锁,那么可以插入数据,第一个会话插入数据提交了,第二个会话在同一个事务中插入唯一主键的值会报错。称之为幻读。
7、oreacle常用的数据类型: varchar2 最长可以存储1万个汉字。

8、表的创建:
1、创建表的时候约束规则的校验:
其中外键是最关键的。有三种情况:设置外键的时候,长度和类型要与关联表保持一致。
首先在自己的表设置外键,关联某个表的主键或者唯一键。

外键约束的三种类型:默认依赖的表是不可以删除的。restrict方式。

1 --创建表的时候可以给表中的数据添加数据校验规则,这些规则称之为约束 2 /* 3 约束分为五大类 4 not null: 非空约束,插入数据的时候某些列不允许为空 5 unique key:唯一键约束,可以限定某一个列的值是唯一的,唯一键的列一般被用作索引列。 6 primary key:主键:非空且唯一,任何一张表一般情况下最好有主键,用来唯一的标识一行记录, 7 foreign key:外键,当多个表之间有关联关系(一个表的某个列的值依赖与另一张表的某个值)的时候,需要使用外键 8 check约束:可以根据用户自己的需求去限定某些列的值 9 */ 10 --个人建议:再创建表的时候直接将各个表的约束条件添加好,如果包含外键约束的话,最好先把外键关联表的数据优先插入 11 12 insert into emp(empno,ename,deptno) values(9999,'hehe',50); 13 14 create table student 15 ( 16 stu_id number(10) primary key, 17 name varchar2(20) not null, 18 age number(3) check(age>0 and age<126), 19 hiredate date, 20 grade varchar2(10) default 1, 21 classes varchar2(10), 22 email varchar2(50) unique, 23 deptno number(2) 24 ); 25 insert into student(stu_id,name,age,hiredate,classes,email,deptno) values(20191109,'zhansgan',111,to_date('2019-11-09','YYYY-MM-DD'),'1','12443@qq.com',10); 26 //手动添加外键的时候,需要默认一个名字 fk_001 就是默认的名字。 27 alter table student add constraint fk_0001 foreign key(deptno) references dept(deptno);
9、索引:
1、oreacle准确的说可以为 唯一键的约束条件创建索引。
2、索引的意义: 1、首先索引是存储在磁盘中的,2、现在有io瓶颈和网络瓶颈,所以我们可以尽量减少io的次数和io的量 3、读取数据的时候有局部性原理和dataPage(4k
的倍数)4、也不是索引每次都随便取值的,索引是有数据结构的,在mysql中有B+tree 。会按照一个块一个块读。 5、在索引的文件中,有offset偏移量可以直接指向数据的地址。去除所要的数据。
本文来自博客园,作者:Jerry&Ming,转载请注明原文链接:https://www.cnblogs.com/jerry-ming/articles/16212527.html

浙公网安备 33010602011771号