天天看點

oracle更新及實物處理

oracle資料增加:

資料增加有兩種方式

1)INSERT INTO 表[(列1,列2,...)] VALUES(值1,值2,.....)

2)INSERT INTO 表[(列1,列2,...)] 子查詢

第一種是我們常見的插入資料操作,但是當我們使用第一種時要注意幾點

1.最好使用完整文法進行資料增加,雖然像INSERT INTO emp VLUES(0,'asd','asdas',da,TO_DATE('2014-08-11','yyyy-mm-dd'),0,0,0);這樣的插入也可以

但是為了更好的了解所插入的列是什麼意思,也為了更好的維護在INTO emp()中寫入列,最好不省略。

2.如果要插入的記錄隻有部分記錄那麼隻需要編寫所需要的資料列即可,如:INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(......);當然這裡也

推進寫出列名。

第二種我們平時使用比較少,但是oracle提供了此功能,就是通過子查詢查到記錄然後将結果插入到需要插入的表中

如:INSERT INTO emp select * from emp where deptno=10;

資料的更新:

更新操作也插入一樣也有兩種方式更新

1)UPDATE 表 SET 字段=值[,字段=值,....] [WHERE 更新條件(s)]

2)UPDATE 表 SET(字段,字段...)=(SELECT 字段,字段,... FROM 表 WHERE 條件(s))

第一種操作我們常用,但是我們要注意,如果不寫更新條件表示更新整個表,但是在資料庫的更新操作時如果可以盡量不要更新整個表,如果資料量比較大,

這樣性能會非常低。

對于第二種操作其實更插入操作類似,比如說将編号為7369的工作和薪金更改為與7839的相同可以這麼使用

UPDATE emp SET(job,sal)=(select job,sal from emp where empno=7839) where empno=7369;

資料的删除:

形式:DELETE FROM 表 [WHERE 條件];

删除操作比較簡單,在删除操作時如果不寫删除條件表示删除整個表。

事物:

在ORACLE中事物的操作指令有下面幾個

SET AUTOCOMMIT=OFF:關閉自動送出處理

SET AUTOCOMMIT=ON:打開自動送出處理

COMMIT:送出事物

ROLLBACK TO[復原點]:復原事物

SAVEPOINT 事物點名稱:設定事物儲存點

其中ROLLBACK可以復原,但是它復原是復原到本次操作之前,如果想復原到具體某個點,那麼我們要在我們希望復原的操作出設定一個事物點,然後通過

ROLLBACK TO 點復原到那個點。

鎖:

事物處理的核心操作就是鎖,當一個SESSION操作表時将其鎖住,隻要此操作沒有送出或者復原那麼另外的SESSION将不會知道目前SESSION的操作

鎖又有行級鎖和表級鎖

當使用者執行INSERT,UPDATE,DELETE和SELECT FOR UPDATE時,ORACLE隐式地實作了記錄的鎖定,這種鎖稱為排它鎖。比如所:

第一個SESSION使用UPDATE語句更新某個雇員的工資,當第二個SESSION想更新同一個雇員資訊時将一直處于等待狀态。

對于表級鎖定我們要手動加鎖,文法規則:LOCK TABLE 表名稱|視圖名稱,表名稱|視圖名稱,.....IN 鎖定模式 MODE[NOWAIT]

其中NOWAIT表示當視圖鎖定一張資料表時,如果發現已經被其他事物鎖定不會等待

上面語句中的鎖定模式常見的有:

ROW SHARE:行共享鎖,允許其他事物并發對表進行各種操作,但不允許任何事物對同一張表進行獨占操作(也就是說禁止排它鎖)

ROW EXCLUSIVE:行排它鎖,允許使用者進行任何操作,不能防止其他事物對同一張表手工鎖定或獨占操作

SHARE:共享鎖,其他事物隻允許查詢操作,不能執行修改操作

SHARE ROW EXCLUSIVE:共享排它鎖,允許使用者進行查詢操作,不允許其他使用者使用共享鎖,比如說(SELECT FOR UPDATE就是共享排它鎖)

EXCLUSIVE:排它鎖,事物以獨占方式鎖定表,其他使用者允許查詢,但不能修改也不能設定任何的鎖。

比如設定共享鎖:LOCK TABLE emp IN SHARE MODE NOWAIT;此時如果第二個SESSION要對表進行修改将不會有任何結果。

當然表能鎖定就能解鎖,oracle中解鎖時通過ALTER SYSTEM KILL SESSION 'SID,SERIAL#'操作完成的

其實SID可以通過v$locked_object資料字典查到,SERIAL#可以通過v$session資料字典查到,舉例看看

第一個SESSION:select * from emp where deptno=20 FOR UPDATE

第二個SESSION:select * from emp where deptno=20 FOR UPDATE

此時第二個SESSION将處于等待狀态

我們先檢視資料庫中的鎖定情況select session_id,oracle_username,process from v$locked_object

可以看到幾個SID,然後我們将根據SID在v$session資料字典中找到SERIAL#

select sid,serial#,username,lockwait,status from v$session where sid IN(上面SID1,SID2,..)

此時找到我們操作表的鎖的SID和SERIAL#,解除鎖定即可

ALTER SYSTEM KILL SESSION 'SID,SERIAL#'