阿婆家的ORACLE事務大全

主要接觸的數據庫對象有:

存儲過程:Procedures

觸發器:Triggers

表:Tables

用戶:User

索引:Indexes

視圖:Views

序列:sequences

同義詞:Synonyms

1.同義詞學習
在oracle數據庫中Synonyms,主要是給表,存儲過程,觸發器,視圖等名別名
select * from SCOTT.EMP;//此處SCOTT.EMP可以創建一個同義詞來代替
create synonym myemp for scott.emp;
select * from myemp;//此時myemp代表的就是scott.emp
drop synonym myemp;//刪除同義詞
注意事項:同義詞要注意是擁有這個create synonym權限的用戶纔可以,dba擁有全部的權限
2.序列

在mysql裏面,我們表字段中有一個auto_increment的字段,可以實現數據的自增長,oracle中卻沒有。
在oracle中序列的作用主要是生成連續的整數,常用在主鍵自增長中。(觸發器)
(1)首先要創建序列
create sequence auto_incre
start with 1
increment by 1
nomaxvalue
minvalue 1
nocycle
nocache

select auto_incre.nextval from dual;
select auto_incre.currval from dual;
(2)在做插入操作的時候使用序列(這個序列對象是在該用戶下共享的)
insert into dept values(auto_incre.nextval,'xx','china');
insert into student values(auto_incre.nextval,'zs',30,'男'); commit;rollback;
drop sequence auto_incre;
3.視圖:一張表或者多張表的預定義查詢(視圖實際上是把基表的查詢結果臨時表重新命名別名),一般視圖都是做查詢操作
create view myselect
as
select * from dept;
//查詢出在銷售部的所有員工的姓名,工作,薪資
create view myselect3
as
select ename,job,sal from emp where deptno=(select deptno from dept where dname='SALES')
WITH READ ONLY
select * from myselect;
SELECT * FROM MYSELECT2;
好處:1.屏蔽性 2.安全性 3.降低了複雜性
DROP VIEW MYSELECT2;
4.索引:index-->相當於一本書裏面的目錄頁(提高檢索(查詢)速度):算法tree hash

一張表: id name content age address score beizhu 能不能把這個表沒有字段都變成索引項?

在mysql或者oracle中會默認把 primary key當初索引項,或者被unique修飾的字段,當成索引項
create index index_sname on student(sname);
注意:1.對經常被查詢的列的數據可以使用索引提高速度,但是不是索引越多越好,因爲增刪改都會更新索引,會降低效率
2.使用unique修飾索引的時候要注意(區分情況,一般主鍵是唯一的)


5.觸發器
oracle 使用觸發器實現id自增
前提:存在數據庫di_test,主鍵爲id。
1.創建一個索引sequence
create sequence di_test_id
minvalue 1
nomaxvalue
start with 1
increment by 1
nocache;
2.創建一個觸發器。在插入數據之前觸發
create or replace trigger trigger_di_test_insert
before insert on di_test
for each row
declare
-- local variable here
begin
-- Column "ID" uses sequence di_test_id
select di_test_id.nextval into :new.ID from dual;
end trigger_di_test_insert;

觸發器在數據庫裏以獨立的對象存儲,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啓動運行。
即觸發器是當某個事件發生時自動地隱式運行。並且,觸發器不能接收參數。所以運行觸發器就叫觸發或點火(firing)。
ORACLE事件指的是對數據庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。
ORACLE將觸發器的功能擴展到了觸發ORACLE,如數據庫的啓動與關閉等。
所以觸發器常用來完成由數據庫的完整性約束難以完成的複雜業務規則的約束,或用來監視對數據庫的各種操作,實現審計的功能。


事務(Transaction)

事務:

  事務是指作爲單個邏輯工作單元執行的一組相關操作。  

  這些操作要求全部完成或者全部不完成。

銀行轉賬:A--> B 5000 銀行絕對不允許A沒有轉賬成功,B卻收到了轉賬







使用事務的原因:保證數據的安全有效。

事務的四個特點:(ACID)

  1、原子性(Atomic):事務中所有數據的修改,要麼全部執行,要麼全部不執行。

  2、一致性(Consistence):事務完成時,要使所有所有的數據都保持一致的狀態,換言之:通過事務進行的所有數據修改,必須在所有相關的表中得到反映。

  3、隔離性(Isolation):事務應該在另一個事務對數據的修改前或者修改後進行訪問。

  4、持久性(Durability):保證事務對數據庫的修改是持久有效的,即使發生系統故障,也不應該丟失。

事務組成:

  一條或者多條DML,[一條DDL]和一條DCL。

事務的分類:

  1、顯式事務:

    (1)要去顯式的調用DCL。

    (2)只有用到COMMIT以後纔會真正寫入數據庫,也持久化了。

  2、隱式事務:

    (1)如果人工要使用隱式事務,SET AUTOCOMMIT ON (只針對一個連接)

    (2)以下情況爲自動提交:

       1)正常執行完成的DDL語句:create、alter、drop

       2)正常執行完場的DCL語句GRANT、REVOKE

       3)正常退出的SQLPlus或者SQL Developer等客戶端

回滾:

  RollBack只能對未提交的數據撤銷,已經Commit的數據是無法撤銷的,因爲commit之後已經持久化到數據庫中。

  

髒讀(Dirty Read):事務T1更新了一行數據,還沒有提交所做的修改,T2讀取更新後的數據,T1回滾,T2讀取的數據無效,這種數據稱爲髒讀數據。

不可重複讀(UNrepeatable Read):事務T1讀取一行數據,T2修改了T1剛剛讀取的記錄,T1再次查詢,發現與第一次讀取的記錄不相同,稱爲不可重複讀。

幻讀(Phantom Read):事務T1讀取一條帶WHERE條件的語句,返回結果集,T2插入一條新紀錄,恰好也是T1的WHERE條件,T1再次查詢,結果集中又看到T2的記錄,新紀錄就叫做幻讀。

隔離級別:

  NO_TRANSACTION     不支持事務

  READ_UNCOMMITED    允許髒讀、不可重複讀、幻讀

  READ_COMMITED     允許不可重複讀、幻讀,不允許髒讀

  REPEATABLE       允許幻讀,不允許髒讀、不可重複讀

  SERIALIZABLE       髒讀、不可重複讀、幻讀都不允許

Oracle支持SQL92標準的READ_COMMITED、SERIALIZABLE,自身特有的READ_ONLY


鎖:

排它鎖:(X鎖,eXclusive LockS)

  當有DML語句執行的時候,設計的行都會加上排它鎖,其他事物不能進行讀取修改。

共享鎖:(S鎖,Shared Locks)

  加了共享鎖的數據,可以被其他事物讀取,但不能修改。如select語句。

爲了保證性能:樂觀鎖,悲觀鎖

  悲觀鎖:每次都是假設數據肯定會衝突,數據開始讀取時就把數據給鎖住。

  樂觀鎖:每次都是假設一般情況下不會發生數據衝突,只有數據更新提交的時候,纔會對數據的衝突與否進行檢測,如果發生衝突,返回錯誤信息讓用戶處理。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章