鎖及事務的高級使用

鎖的概念:鎖是數據庫用來控制共享資源併發訪問的機制,鎖用於保護正在被修改的數據,直到提交或回顧了事務之後,其他用戶纔可以更新數據。

模擬封鎖問題

a. 用戶1檢索一行數據,並準備修改

b. 用戶2檢索到相同的一行數據

c. 用戶2刪除了這一行數據,並提交

d. 用戶1修改那一行,並提交了,結果程序報錯,該行不存在

處理方法:

select * from emp where empno=7900 for update;

加了for update就等於對emp這一行記錄加了一個鎖,其他用戶不允許對這一行記錄來做修改和刪除。

鎖定的優點

一致性:一次只允許一個用戶來修改數據

完整性:爲所有用戶提供正確的數據。如果一個用戶進行了修改並保存,鎖做的修改將反映 給所有用戶。

並行性:允許多個用戶訪問同一數據

鎖的類型

 

行級鎖

行級鎖:對正在被修改的行進行鎖定。其他用戶可以訪問除被鎖定的行以外的行。

1、行級鎖是一種排他鎖,防止其他事務修改此行。

2、在使用以下語句時,Oracle會自動應用行級鎖:insertupdatedeleteselect...for update

3Select...for update語句運行用戶一次鎖定多條記錄進行更新

4、使用commitrollback語句釋放鎖

行級鎖語句:select...for update [of columns] [wait n|nowait];

說明:of字句用於指定即將更新的列,即鎖定行上的特性列。Wait字句指定等待其他用戶釋放鎖的秒數,防止無限期的等待。

行級鎖實例1

Select * from order_master where vencode=’V002’ for update of odate,del_date;--鎖定兩列

Update order_master set del_data=’28-08-05’ where vencode=’V002’;

Commit;

Select * from order_master where vencode=’V002’ for update wait 5;--如果該行已經有其他用戶要對它進行更新,則等待5秒用戶還沒有更新完,就報錯

Select * from order_master where vencode=’V002’ for update nowait;--如果該行已經有其他用戶要對它進行更新,不等待直接報錯

使用for update wait 字句的有點如下:

1、防止無限期地等待被鎖定的行;

2、允許應用程序中對鎖的等待時間進行更多的控制;

3、對於交互式應用程序非常有用,因爲這些用戶不能等待不確定;

4、若使用了skip locked,則可以越過鎖定的行,不會報告有wait n 引發的“資源忙”異常報告。

表級鎖

表級鎖:鎖定整個表,限制其他用戶對錶的訪問。當一個事物在進行DML操作時,所在的事務會對所操作的表加表級鎖,以保證在這個事務過程中表不會被改變。

使用命令顯示地鎖定表,應用表級鎖的語法是:

Lock table table_name in mode MODE;

 

 表級鎖的類型:

行共享(row share禁止其他用在在這個表使用排他鎖。

行共享在以下的操作會產生RS lock

1Select * from tab for update(查詢所有記錄就等於查詢整個表)

2Lock table ttablename in row share mode;

RS不允許的操作

Lock table tablename in exclusive mode

行排他(row exclusive禁止使用排他鎖和共享鎖。

RXRow Exclusive Table Locks

以下的操作會產生RS lock

1、insertupdatedelete

2、Lock table tablename in row exclusive mode;

RX不允許的操作

1、Lock table tablename in share mode

2、Lock table tablename in share exclusive mode

3、Lock table tablename in exclusive mode

共享鎖(share):鎖定表,僅允許其他用戶查詢表中的行;禁止其他用戶插入、更新和刪除行;多個用戶可以同時在同一個表上應用此鎖(但是都不能進行DML操作)。

SShare Table Locks

以下操作產生S lock

Lock Table tablename in share mode

S不允許的操作

1、Lock Table tablename in share row exclusive mode 

2、Lock table tablename in exclusive mode

3、Lock table tablename in row exclusive mode

共享行排他(share row exclusive):比共享鎖更多的限制,禁止使用共享鎖及更高的鎖。

SRXShare Row Exclusive Table Locks

以下操作產生SRX LOCK

Lock table tablename in share row exclusive mode

SRX不允許的操作
1Lock table tablename in share mode

2Lock table tablename in share row exclusive mode

3Lock table tablename in row exclusive mode

4Lock table tablename in exclusive mode

排他(exclusive):限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表。是最高限制的鎖。

XExclusive Table Locks

以下操作產生X Lock

Lock Table tablename in Exclusive mode

X不允許的操作

除了查詢不允許所有的操作

ORACLE裏鎖有以下幾種模式:

0級鎖:none

1級鎖:null 

Select,有時會在v$locked_object出現

2級鎖:Row-S行共享(RS);共享表鎖,sub share

2級鎖有select for update lock for updatelock row share

Select for update 當對話使用for update子串打開一個遊標時,所有返回集中的數據行都將處於行級(Row-X)獨佔式鎖定,其他對象只能查詢,這些數據後不能進行updatedeleteselect for update操作。

3級鎖:Row-X行獨佔(RX):用戶行的修改,sub Exclusive

3級鎖有Insertupdatedeletelock row exclusive

沒有commit之前插入同樣的一條記錄會沒有反應,因爲後一個3的鎖會一直等待上一個3的鎖,我們必須釋放掉上一個3才能繼續工作。

4級鎖:share共享鎖(S),阻止其他DML操作,share

4級鎖有create indexlock share

Lock_mode234不印象DMLinsertdeleteupdateselect)操作,但DDLalterdrop等)操作會提示ora-00054錯誤。

5級鎖:S/Row-X共享行獨佔(SRX),阻止其他事物操作,share/sub

Exclusive級鎖有lock share row exclusive

具體來講有主外鍵約束時update/delete...;可能會產生45的鎖。

6級鎖:exclusive獨佔(X),獨佔訪問使用,exclusive

6級鎖有Alter tableDrop tableDrop indexTruncate tableLock Exclusive

死鎖

當兩個事務相互等待對方釋放資源時,會形成死鎖

Oracle會自動檢測死鎖,並通過結束其中的一個事務來解決死鎖

鎖實例2:(死鎖)

1、用戶1對錶A進行update,沒有提交

 

2、用戶2對錶B進行update,沒有提交

 

3、如果用戶2此時對A表做update,則會發生阻塞鎖現象

 

沒有反應,發生阻塞鎖現象

4、如果用戶1此時對B表做update,則會產生死鎖現象

用戶1等待一段時間

 

用戶2出現

 

事務

事務簡介

事務:就是一個完整的邏輯工作單元,由多個操作組成,所以操作要買全部成功,要麼全部失敗。

事務特點:原子性(銀行轉賬),一致性(銀行轉賬總金額),隔離性(一個事務在操作,另一個事務不能操作),持久性(數據永久保存)簡稱ACID

數據庫事務:由多個SQL語句組成的一個邏輯工作單元,所以有SQL都必須同時執行成功,只要其中一個執行失敗,則所有執行過的SQL自動全部回滾。

基本的事務處理:

oraclecommitrollbacksavepoint這三條語句可以完成基本的事務管理功能

開始事務可以使用transation.begintransation或執行第一個sql事務開始

事務控制語言:

事務是最小的工作單元,作爲一個整體進行工作

保證事務的整體成功或失敗,稱爲事務控制

用戶事務控制的語句有

1、commit-提交併結束事務處理

2、Rollback-撤銷事務中已完成的工作

3、Savepoint-標記事務中可以回滾的點

 事務實例1


COMMIT語句

當向數據庫發出commit語句,那該事物就被被總結了,並且:

1、事務完成了所有工作永久化;

2、其他事務可以看到此事務所作的修改;

3、事務所需要執行的所有加鎖(lock)處理被釋放。

Rollback語句

當想數據庫發出rokkback語句,那該事物就被終結了,並且:

1、事務完成的所有工作被取消(undo);

2、事務所需要執行的所有加鎖(lock)處理被釋放。

Savepoint語句

Rollback會撤銷整個事務,使用savepoint可以做到部分撤銷事務。

事務實例2:(在一個完整的事務中使用savepoint

 

OracleDDL語句對事務的影響

oracle中,執行DDL語句(入create tablecreate view等)時,會在執行之前自動發出一個commit命令,並在隨後發出一個commit或者rollback密碼,也就是說,DDL會像如下僞碼一樣執行:

Commit;

DDL_Statement;

If(Error)then

Rollback;

Else

Commit;

End if;

事務實例3:(DDL語句對事物的影響)

 

 

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