----------------------------------------------事務(wù)特性------------------------------------------------------------
1.原子性(atomicity) --事務(wù)處理要么全部進(jìn)行,要么不進(jìn)行。
2.一致性(consistency) –事務(wù)處理要將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱?/span> 一種狀態(tài)。
3.隔離性(isolation) –在事務(wù)處理提交之前,事務(wù)處理的效果不能由系統(tǒng)中的其他事務(wù)看到。
4.持久性(durability) –一旦提交了事務(wù),他就永遠(yuǎn)生效。
5.set autocommit on--設(shè)置數(shù)據(jù)庫系統(tǒng)環(huán)境為自動提交事務(wù):
SQL> set autocommit on;
SQL> insert into t values(1,'2','2');
已創(chuàng)建 1 行。
提交完成。
SQL> set autocommit off;
SQL> insert into t values(1,'2','2');
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
6.鎖:(防止進(jìn)程之間因為搶占資源,產(chǎn)生死鎖而設(shè)定一種預(yù)防死鎖產(chǎn)生的機(jī)制)
允許或者拒絕資源訪問的一種機(jī)制
為了防止用戶在同一時間內(nèi)并發(fā)的訪問和修改數(shù)據(jù)庫資源,orcale中使用不同類型的鎖控制對數(shù)據(jù)的并發(fā)訪問,以防止用戶之間出現(xiàn)破壞性的操作。
鎖定的類型:
(1)行級鎖:行被排他鎖定
(2)表級鎖:共享鎖,共享更新鎖,排他鎖
---------------------------------------------------------
行級鎖:
行被排他鎖定,在某行的鎖被釋放之前,其他用戶不能修改此行,使用 commit 或 rollback 命令釋放鎖
Oracle 通過使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 語句自動獲取行級鎖
SELECT…FOR UPDATE 子句
在表的一行或多行上放置排他鎖,用于防止其他用戶更新該行,可以執(zhí)行除更新之外的其他操作,只有該用戶提交事務(wù),其他用戶才能夠更新gname
select * from goods where gid=1001
for update of gname;
server1: server2
create table goods (gid int );
insert into goods values(1)
insert into goods values(2)
別的進(jìn)程訪問該表時,可以執(zhí)行除更新之外的其他操作
select * from goods where gid=1 for update of gid 訪問server1時,可以對goods表進(jìn)行添加,刪除,查詢,但不能修改
FOR UPDATE WAIT 子句是Oracle9i 中的新增功能:
為了防止無限期地等待鎖定的行,等待間隔必須指定為數(shù)值文字,等待間隔不能是表達(dá)式、賦值變量或 PL/SQL。
變量
select * from goods where gid=1001 for update of gname wait 3
等待用戶釋放更新鎖的時間為3秒,否則超時。
-------------------------------------------
表級鎖:
保護(hù)表的數(shù)據(jù)
在多個用戶同時訪問數(shù)據(jù)時確保數(shù)據(jù)的完整性
可以設(shè)置為三種模式:共享、共享更新和排他
語法:
Lock table < table_name> in <mode>;
--------------------
共享鎖:僅允許其他用戶執(zhí)行查詢操作,不能插入、更新和刪除,多個用戶可以同時在同一表中放置此鎖
Lock table table_name
in share mode [nowait];
rollback 和commit命令釋放鎖
Nowait 關(guān)鍵字告訴其他用戶不用等待
lock table<tabale_name>[,<table_name>,....]
in share mode[nowait]
---------------------
共享更新鎖:
鎖定要被更新的行
允許其他用戶同時查詢、插入、更新未被鎖定的行
在 SELECT 語句中使用“FOR UPDATE”子句,可以強(qiáng)制使用共享更新鎖
允許多個用戶同時鎖定表的不同行
加鎖的兩種方法
(1)lock table tab_name in share update mode;
(2)Select column1, column2 From goods Where gid=1001 For update of column1, column2
lock table<tabale_name>[,<table_name>,....] in share update mode [nowait]
-------------------------
排他鎖:
與其他兩種鎖相比,排他鎖是限制性最強(qiáng)的表鎖,僅允許其他用戶查詢數(shù)據(jù),不允許執(zhí)行插入、刪除和更新操作,在同一時間僅允許一位用戶在表上放置排他鎖
共享鎖與此相反
lock table<tabale_name>[,<table_name>,....]
in exclusive mode [nowait]