鎖的概念:鎖是數據庫用來控制共享資源併發訪問的機制,鎖用於保護正在被修改的數據,直到提交或回顧了事務之後,其他用戶纔可以更新數據。
模擬封鎖問題
a. 用戶1檢索一行數據,並準備修改
b. 用戶2檢索到相同的一行數據
c. 用戶2刪除了這一行數據,並提交
d. 用戶1修改那一行,並提交了,結果程序報錯,該行不存在
處理方法:
select * from emp where empno=7900 for update;
加了for update就等於對emp這一行記錄加了一個鎖,其他用戶不允許對這一行記錄來做修改和刪除。
鎖定的優點
一致性:一次只允許一個用戶來修改數據
完整性:爲所有用戶提供正確的數據。如果一個用戶進行了修改並保存,鎖做的修改將反映 給所有用戶。
並行性:允許多個用戶訪問同一數據
鎖的類型
行級鎖
行級鎖:對正在被修改的行進行鎖定。其他用戶可以訪問除被鎖定的行以外的行。
1、行級鎖是一種排他鎖,防止其他事務修改此行。
2、在使用以下語句時,Oracle會自動應用行級鎖:insert、update、delete、select...for update
3、Select...for update語句運行用戶一次鎖定多條記錄進行更新
4、使用commit或rollback語句釋放鎖
行級鎖語句: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
1、Select * from tab for update(查詢所有記錄就等於查詢整個表)
2、Lock table ttablename in row share mode;
RS不允許的操作
Lock table tablename in exclusive mode
行排他(row exclusive):禁止使用排他鎖和共享鎖。
RX(Row Exclusive Table Locks)
以下的操作會產生RS lock
1、insert、update、delete
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操作)。
S(Share 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):比共享鎖更多的限制,禁止使用共享鎖及更高的鎖。
SRX(Share Row Exclusive Table Locks)
以下操作產生SRX LOCK
Lock table tablename in share row exclusive mode;
SRX不允許的操作
1、Lock table tablename in share mode;
2、Lock table tablename in share row exclusive mode;
3、Lock table tablename in row exclusive mode;
4、Lock table tablename in exclusive mode。
排他(exclusive):限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表。是最高限制的鎖。
X(Exclusive 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 update,lock row share
Select for update 當對話使用for update子串打開一個遊標時,所有返回集中的數據行都將處於行級(Row-X)獨佔式鎖定,其他對象只能查詢,這些數據後不能進行update、delete或select for update操作。
3級鎖:Row-X行獨佔(RX):用戶行的修改,sub Exclusive
3級鎖有Insert、update、delete、lock row exclusive
沒有commit之前插入同樣的一條記錄會沒有反應,因爲後一個3的鎖會一直等待上一個3的鎖,我們必須釋放掉上一個3才能繼續工作。
4級鎖:share共享鎖(S),阻止其他DML操作,share
4級鎖有create index、lock share
Lock_mode爲2、3、4不印象DML(insert、delete、update、select)操作,但DDL(alter、drop等)操作會提示ora-00054錯誤。
5級鎖:S/Row-X共享行獨佔(SRX),阻止其他事物操作,share/sub
Exclusive級鎖有lock share row exclusive
具體來講有主外鍵約束時update/delete...;可能會產生4、5的鎖。
6級鎖:exclusive獨佔(X),獨佔訪問使用,exclusive
6級鎖有Alter table、Drop table、Drop index、Truncate table、Lock 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自動全部回滾。
基本的事務處理:
在oracle中commit、rollback、savepoint這三條語句可以完成基本的事務管理功能
開始事務可以使用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)
Oracle中DDL語句對事務的影響
在oracle中,執行DDL語句(入create table,create view等)時,會在執行之前自動發出一個commit命令,並在隨後發出一個commit或者rollback密碼,也就是說,DDL會像如下僞碼一樣執行:
Commit;
DDL_Statement;
If(Error)then
Rollback;
Else
Commit;
End if;
事務實例3:(DDL語句對事物的影響)