Oracle day3

TCL:transaction control language 事务控制语句

*:事务只会影响DML(data munipulate language)操作

事务:在一些列操作中有多个步骤,只有所有的步骤成功执行那么整个操作才算完成,如果有其中一个环节失败,那么整个操作都算失败.

Oracle中在sqlplus中开启事务:
sat autocommit off;        --关闭自动提交

set autocommit on;        --开启自动提交

提交操作:将受影响的数据持久化到数据库中

事务特性:

原子性:事务不可分

一致性:数据类型保持一致

持久性:事务能够将数据持久化到数据库中

隔离性:多个事物之间可能会产生一些隔离问题

隔离性问题:

脏读:事务B读取到事务A中未提交的数据,然后事务A对刚才的操作进行了回滚操作,那么事务B读取到的数据就无效了,也就是脏数据 -- 读到了其他事务未提交的数据

不可重复读:事务A对表内数据修改提交后,事务B再次读取数据,发现和之前读取到的数据不一样

-- 一次读取到的数据其他事务对数据进行了修改,再次读取数据不一致

幻读:事务A对表新增数据并提交以后,事务B再次读取这张表,就会发现数据多了,就像发生了幻觉一样

--相同的查询条件,在别的事务添加或者删除数据后,再次查询不一致

隔离级别:

数据库事务的隔离级别一共有4个,由低到高依次为Read uncommitted,Read committed,Repeatable read,Serializable,这四个隔离级别可以逐个解决脏读,不可查重复读,幻读这几个问题

                                                        脏读          不可重复读       幻读
未提交读  Read uncommitted         会                 会                    会
提交读     Read committed            不会               会                    会
可重复读  Repeatable read            不会             不会                 会
序列化     Serializable                    不会               不会              不会

1.ISOLATION_READ_UNCOMMITTED:【很少应用,效果很差,效率也没高哪去】
这个是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
2.ISOLATION_READ_COMMITTED:【Oracle默认的隔离级别 大多数数据库默认】
保证一个事务修改的数据只有在提交以后别的事务才能读取。
3.ISOLATION_REPEATABLE_READ:【Mysql默认的隔离级别】
4.ISOLATION_SERIALIZABLE:【根治所有问题 但是牺牲效率】
花费高代价但是最可靠的事务隔离级别,事务被处理为顺序执行

Oracle中的提交读级别:(默认)
set transaction isolation level read committed;

*:更改数据库的隔离级别必须在开启事务的第一句话来更改

commit:提交  将数据持久化到数据库中
rollback:回滚  将事务中的操作回滚到第一步操作之前,就当什么都没发生
savepoint:还原点  可以回退到指定的位置

显示提交:在事务中手动commit
隐式提交:在事务中,如果正在执行DML操作,突然做了一个DDL操作,数据库会自动在DDL操作之前隐式的做一个commit操作

当发生以下操作时,事务将结束
1.利用commit/rollback进行事务提交和回滚
2.执行DDL语句时,事务将自动提交
3.如果使用sqlplus时,正常退出事务会自动提交,非正常退出事务回滚

锁    
-- 锁的介绍
锁可以防止事务之间的破坏性交互,约束了最大程度的并发性,数据的完整性

-- 锁的分类
1.排他锁(X锁)防止资源共享,也就是当一个事务正在操作数据时,其他事务不可以操作这个事务的数据。
2.共享锁(S锁)被锁住的数据只能被读取,但是不能修改。

-- 锁的类型
DML锁:也就数据锁,用于保护数据,事务在最开始时添加,通过commit或者rollback释放。
DDL锁:可以保护数据对象的结构。Oracle自动的施加的释放。
内部闩锁:保护数据库的内部结构,完全自动调用。

行级锁:也叫事务锁,防止数据被同时多个事务进行修改,直到commit或者rollback。
表级锁:防止在修改数据的时候,表结构发生变化。

select name,salary from student for update;
会对student表进行加锁,此时只允许当前session对已经存在的数据进行更新,其他session仍可以进行insert操作。

-- 锁等待和死锁
锁等待也叫锁冲突,锁等待会严重影响数据库的性能和日常工作。
死锁,也就锁等待的一种,但是死锁会让事务一直处于锁等待的状态。

-- 查看是否有死锁
select sid,serial#,username from v$session where sid in (select blocking_session from v$session);

-- 查看死锁的语句
select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in(select session_id from v$locked_object));

解决死锁:
https://localhost:1158/em
性能-->其他监视链接-->实例锁

约束:constraint

主键约束:primary key

        主键:在一张表中能够唯一定位一条数据的列,称为主键列

        *:非空且唯一

        *:建表时未添加约束,后期添加约束

        create table test(id number(5),name varchar2(20));

        alter table test add constraint zj primary key(id);

        *:建表时添加约束

        create table test2(id number(5) primary key,name varchar2(20));

外键约束: foreign key        *:references

        外键:在子表中有一个列引用了父表中的主键列,那么这个列在子表中就被称为外键列

        *:一张表可以有多个外键

          表名        主键             外键    
1)    emp        empno        deptno        子表
         dept        deptno                            父表
         emp.deptno = dept.deptno

2)    dept        deptno        salno        子表
       salgrade    salno                           父表
       dept.salno = salgrade.salno

3)    emp        empno        deptno  salno    子表
         dept         deptno                                  父表
    salgrade        salno                                   父表
    emp.deptno = dept.deptno
    emp.salno = salgrade.salno

非空约束:not full

唯一约束:unique

检查约束:check

create table school{

id number(5) primary key,

name varchar2(20) not null unique,

addr varchar2(20)

};

insert into school values(1,'北京大学','北京');
insert into school values(2,'山东大学','济南');
insert into school values(3,'厦门大学','厦门');
insert into school values(4,'山东师范','泉城');

create table teacher(
id number(5) primary key,
name varchar2(20) not null,
hobby varchar2(20)
);

insert into teacher values(1,'琛哥','剑道');
insert into teacher values(2,'周哥','篮球');
insert into teacher values(3,'乐哥','敲代码');
insert into teacher values(4,'老大','键盘');

create table class(
id number(5) primary key,
name varchar2(20) unique not null,
tid number(5) references teacher(id)
);

insert into class values(1,'ET2211',3);
insert into class values(2,'ET2212',2);
insert into class values(3,'ET2301',1);

create table student(
id number(5) primary key,
name varchar2(20) not null,
birthday date,
sal number(5) check(sal between 5000 and 10000),
email varchar2(30) unique,
sid number(5) references school(id),
cid number(5) references class(id)
);

insert into student values(1,'葫芦娃',sysdate,5000,'hlw@126.com',2,1);
insert into student values(2,'金刚',to_date('19961212030303','yyyy-mm-dd hh24:mi:ss'),6000,'jg@163.com',1,1);
insert into student values(3,'蜘蛛侠',to_date('19951212030303','yyyy-mm-dd hh24:mi:ss'),7000,'zzx@yahoo.com',2,2);
insert into student values(4,'白龙',to_date('19931212030303','yyyy-mm-dd hh24:mi:ss'),8000,'bl@etoak.com',3,3);

commit;

表名    主键        外键
school    id
teacher    id
class    id        tid(teacher.id)
student    id    sid(school.id)   cid(class.id)

student.sid = school.id
student.cid = class.id
class.tid = teacher.id

***:
常用约束:主键约束和外键约束
先建父表,在建子表,先删子表,再删父表


查看当前用户下有哪些约束:
select table_name,constraint_name,constraint_type from user_constraints;


嵌套查询 = 子查询 = 某些条件是通过查询得出来的

select 嵌套查询 from 嵌套查询 where 嵌套查询;

*:谁和葫芦娃一个学校的?
1)葫芦娃是哪个学校的?
select sid from student where name = '葫芦娃';
2)谁还是这个学校的?
select name from student where sid = 2;

select name from student where sid = (select sid from student where name = '葫芦娃') and name <> '葫芦娃';

练习:
--24查询工资比SMITH员工工资高的所有员工信息

*:学生都上哪些学校?
select name stuname,(select name from school where school.id = student.sid) schname from student;

练习:
--2查询所有工种为CLERK的员工的工号、员工名和部门名。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry鹿17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值