資料庫主要物件及事務

爪哇島的流浪漢發表於2018-07-15

1、事務(Transaction)
事務是一組DML操作的邏輯單元,用來保證資料的一致
性。在一個事務內,組成事務的DML操作,或者一起
成功提交,或者一起撤銷。

commit:事務提交,將全部資料改動進行提交
rollback:事務回滾,回退到事務開始,資料的狀態
和事務開始之前一致
savepoint:事務儲存點

事務的開始和終止:
開始:事務開始於上一個事務的終止或者第一條
     DML(insert/update/delete)語句
終止:事務終止於commit/rollback顯示操作(即控制檯
     輸入commit/rollback)

如果連線關閉,事務將隱式提交
DDL操作,事務將隱式提交
如果出現異常情況(斷電、執行語句失敗),事務將
隱式回滾

事務中資料狀態:如果多個會話操作同一個表資料,
當使用者與伺服器連線成功後,伺服器將與客戶端建立
一個會話(Session),客戶端與oracle伺服器的互動
都是在此會話中進行的。

事務演示:
步驟1:
開啟會話A,建立表並插入一條資料,不提交
create table mytemp(id number(4));
insert into mytemp values(1);

步驟2:
開啟會話B,在會話A進行commit之前,會話B中只能查
看錶結構,檢視不到資料的

步驟3:
會話A中提交操作後,會話B中就可以檢視到資料

步驟4:
會話A中進行update操作,不要提交,會話B中看到的
是原來的資料
update mytemp set id=1001;

步驟5:
會話A提交後,會話B中看到資料修改的

步驟6:
會話A進行update操作沒有提交,會話B中進行delete
操作時被掛起,因為試圖操作相同的資料。
update mytemp set id=1234;
delete from mytemp;

步驟7:
會話A提交,會話B結束阻塞狀態,開始執行

步驟8:
會話A更新資料,之後回滾操作
update mytemp set id=4567;
rollback;

總結:
a.事務內部資料的改變(未提交)只有在自己的
  會話中可以看到
b.事務會對操作的資料加鎖,不允許其他事務操作
c.如果提交操作,資料的改變得到確認,所有的會話
都能看到修改的資料;資料上鎖被釋放;儲存在臨時
空間裡面的資料也會被釋放
d.如果回滾操作,資料的修改被取消;資料上鎖被
釋放;臨時空間被釋放。

儲存點:可以回滾到指定的儲存點
儲存點演示:
drop table mytemp;

//建立表
create table mytemp(id number(4));

//事務開始
insert into mytemp values(3);
//設定儲存點
savepoint A;

insert into mytemp values(4);
savepoint B;

insert into mytemp values(5);
rollback to A;//回滾到儲存點A,A之後的儲存都被
取消

select * from mytemp;//3這個記錄插入資料庫

2、資料庫的主要物件
1)表(Table)
表是資料庫儲存的基本單位,在關係型資料庫中,表
是一個二維結構,由行和列組成,橫向為行也叫記錄,
縱向為列也叫欄位。

2)檢視(View)
檢視也稱虛表(虛擬表,沒有資料)。檢視對應於一條
SELECT語句,此語句得到的結果集被賦予一個名字,
即為檢視的名字。因此可以像操作表一樣操作檢視。

//查詢20部門的員工資訊
select empno,ename,position from emp_xu 
where deptno=20;

//建立檢視
create view view_emp as
select empno,ename,position from emp_xu 
where deptno=20;

//分配許可權
sqlplus /as sysdba 身份登入
grant create view to scott;//授予許可權
revoke create view from scott;//回收許可權

//scott身份登入
conn scott;

//檢視檢視
select * from view_emp;

檢視的使用和表相同的,檢視的好處,簡化查詢,隱藏
資料表中的列。檢視不包含任何資料的,檢視是基表
的資料投影。

//更新基表
更新員工表中1004員工的姓名'郭靖1'
update emp_xu set ename='郭靖1'
where empno=1004;

//更新檢視
更新檢視,將1004員工的姓名'郭靖'
update view_emp set ename='郭靖'
where empno=1004;

總結:
基表的DML操作會改變檢視的顯示結果,對檢視的DML
操作同樣會改變基表中的資料。檢視只是基表的
投影。

3)索引(Index)
索引是用來在資料庫中加速查詢的資料庫物件。通過
快速路徑訪問方式快速定位資料,可以較少的磁碟
I/O操作,提高訪問效能。

全盤掃描方式:查詢效率低
索引查詢:比全盤掃描快

索引結構:資料+地址 (如:張三+room202)
//空間換取時間,使用索引佔用空間,提高查詢效率

自動建立索引:如果資料表中PK/UK
兩種約束,索引會自動建立的,除此之外,需要手動
建立。

自定義索引語法:
create index 索引名 on 表名(列名);

//根據員工號1004找員工姓名
select ename from emp_xu
where empno=1004;

//檢視語句執行時間
set timing on;

//給員工表中員工號新增一個索引
create index index_empno on emp_xu(empno);

//新增索引之後查詢,由於資料量比較小,體現不明顯

4)序列(Sequence)
序列是一種用於生成唯一數字值的資料物件,序列的
值由oracle按遞增或遞減自動生成的,通常用來自動
生成表的主鍵值,是一種高效率獲取唯一主鍵值的
途徑。

特性:產生連續的不同數字值,是資料庫中獨立的物件,
表可以用序列產生的值作為主鍵值,也可以不用。
序列可以為一個表或多個表產生主鍵值,建議一個序列
為一個表產生主鍵值。

//產生從1開始的數字值,步進是1
create sequence first_sequence;

select first_sequence.nextval from dual;//下一個值
select first_sequence.currval from dual;//當前值

create sequence second_sequence
start with 100
increment by 10;//從100開始,以10遞增

select second_sequence.nextval from dual;//下一個值
select second_sequence.currval from dual;//當前值

create sequence third_sequence
start with 1000
maxvalue 1000
increment by -10;//1000開始,10遞減

select third_sequence.nextval from dual;//下一個值
select third_sequence.currval from dual;//當前值

//建立表
create table user_xu(
id number(4) primary key,
name varchar2(10) not  null
);

//建立序列
create sequence user_sequence start with 1000;

//往表裡面放資料
insert into user_xu 
values(user_sequence.nextval,'張三');

insert into user_xu 
values(user_sequence.nextval,'李四');

//檢視錶資料
select * from user_xu;

使用序列插入資料時,有'延遲段'特性,跳過序列
的第一個值。



































 

相關文章