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偏移量可以直接指向数据的地址。去除所要的数据。

posted @ 2022-05-01 12:36  Jerry&Ming  阅读(59)  评论(0)    收藏  举报