Oracle基礎:數據庫操做_數據庫事務_表的鎖定

數據庫操做語句:數據庫

 

INSERT INTO 表名[(字段列表)] VALUES ( 表達式列表);安全

例子:INSERT INTO emp(empno,ename,job,hiredate) VALUES (1001, '小馬', 'CLERK', to_date('2004-11-27','yyyy-mm-dd'));併發

INSERT INTO 表名(字段列表) SELECT(字段名1, 字段名2, ...) FROM 另外的表名;性能

例子:INSERT INTO manager SELECT empno, ename, sal,job FROM emp WHERE job = 'CLERK';spa

 

修改數據的語句UPDATE對錶中指定字段的數據進行修改,通常須要經過添加WHERE條件來限定要進行修改的行,若是不添加WHERE條件,將對全部的行進行修改。 (1) 修改數據的語句UPDATE的基本語法以下: UPDATE 表名 SET 字段名1=表達式1, 字段名2=表達式2, ... WHERE 條件;blog

本例中不能省略WHERE條件,不然將會修改表的全部行。事務

UPDATE 表名 SET(字段名1, 字段名2, ...)=SELECT (字段名1, 字段名2, ...) FROM 另外的表名WHERE條件;ci

例子:UPDATE manager SET (ename, sal) =(SELECT ename,sal FROM emp WHERE empno = 7788) WHERE empno = 2000;it

 

刪除數據的基本語法以下: DELETE FROM 表名 WHERE 條件; 要從表中刪除知足條件的記錄,WHERE條件通常不能省略,若是省略就會刪除表的所有數據。io

刪除記錄並不能釋放Oracle中被佔用的數據塊表空間,它只是把那些被刪除的數據塊標成unused。

DELETE FROM emp WHERE empno=1000;

若是確實要刪除一個大表裏的所有記錄,能夠用TRUNCATE 命令,它能夠釋放佔用的數據塊表空間,語法爲: TRUNCATE TABLE 表名;

 

刪除重複記錄

方法原理:

一、Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是惟一的, rowid肯定了每條記錄是在ORACLE中的哪個數據文件、塊、行上。

二、在重複的記錄中,可能全部列的內容都相同,但rowid不會相同,因此只要肯定出重複記錄中   那些具備最大rowid的就能夠了,其他所有刪除。

 

完全刪除manager表的內容。

執行如下的命令: TRUNCATE TABLE manager;

執行結果: 表已截掉。

說明:此命令和不帶WHERE條件的DELETE語句功能相似,不一樣的是,DELETE命令進行的刪除能夠撤銷,但此命令進行的刪除不可撤銷。

注意:TRUNCATE TABLE命令用來刪除表的所有數據而不是刪除表,表依舊存在。數據不能恢復,不用commit,不能rollback;

 

數據庫事務

事務的特徵:ACID

原子性(Atomicity) : 數據庫中的事務執行是做爲原子,不可再分,整個語句要麼執行,要麼不執行

一致性(Consistency) : 在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞(如外鍵、not null)

理解隔離性(Isolation) : 事務的執行是互不干擾的,一個事務不可能看到其餘事務運行時,中間某一時刻的數據

理解持久性(Durability) : 在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾

 

Oracle的事務控制:

Dirty read: 髒讀意味着一個事務讀取了另外一個事務未提交的數據

Phantom read: 幻讀,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。若是第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣

Unrepeatable Read :不可重複讀,即一個事務範圍內兩個相同的查詢卻返回了不一樣數據

Lost update: 丟失更新,即兩個併發的事務,後提交的事務把先提交事務的修改結果覆蓋了

 

Oracle的事務控制:

Read uncommited :性能最佳,但容許出現髒讀

Read commited : 不容許髒讀,可能出現不可重複讀,幻讀

Repeatable Read: 能夠重複讀,沒有髒讀,可能出現幻讀

Serializable: 性能最差,但安全性最高 Oracle默認的事務級別爲read commited

 

數據庫事務的應用

數據庫事務處理可分爲隱式和顯式兩種。

顯式事務操做經過命令實現,隱式事務由系統自動完成提交或撤銷(回退)工做,無需用戶的干預。

隱式提交的狀況包括:當用戶正常退出SQL*Plus或執行CREATE、DROP、GRANT、REVOKE等命令時會發生事務的自動提交。

還有一種狀況,若是把系統的環境變量AUTOCOMMIT設置爲ON(默認狀態爲OFF),則每當執行一條INSERT、DELETE或UPDATE命令對數據進行修改後,就會立刻自動提交。

設置命令格式以下:

SET AUTOCOMMIT ON/OFF

隱式回退的狀況包括:當異常結束SQL*Plus或系統故障發生時,會發生事務的自動回退。

 

 表的鎖定:

隱式鎖和顯式鎖

在Oracle數據庫中,修改數據操做時須要一個隱式的獨佔鎖,以鎖定修改的行,直到修改被提交或撤銷爲止。 若是一個會話鎖定了數據,那麼第二個會話要想對數據進行修改,只能等到第一個會話對修改使用COMMIT命令進行提交或使用ROLLBACK命令進行回滾撤銷後,纔開始執行。

默認是隱式加鎖,主動鎖定行或表,防止其餘會話對數據的修改

 

 鎖定行:

SELECT * FROM emp WHERE deptno=10 FOR UPDATE;

鎖定表:

LOCK語句用於對整張表進行鎖定。

語法以下: LOCK TABLE 表名 IN {SHARE|EXCLUSIVE} MODE 對錶的鎖定能夠是共享(SHARE)或獨佔(EXCLUSIVE)模式。共享模式下,其餘會話能夠加共享鎖,但不能加獨佔鎖。在獨佔模式下,其餘會話不能加共享或獨佔鎖。

樂觀鎖和悲觀鎖

悲觀鎖(Pessimistic Locking):在整個數據處理過程當中,採起保守態度,將數據所有處於鎖定 狀態(不容許修改、刪除)  如: SELECT * FROM emp WHERE deptno=10 FOR UPDATE; (只容許查詢,不容許修改和刪除鎖定的數據)

樂觀鎖( Optimistic Locking ):樂觀假設不會發生併發衝突,只在提交操做時檢查是否違反數據完整性。 樂觀鎖一般採用檢查version、時間戳、關鍵數據等方式 select ver from emp where empno=7782; update emp set sal =1909,ver=ver+1 where empno=7782 and ver=20; 因爲悲觀鎖在併發環境中影響性能,建議儘可能使用樂觀鎖!

相關文章
相關標籤/搜索