oracle 鎖 悲觀鎖與樂觀鎖

2021-09-12 03:15:53 字數 1745 閱讀 3153

總結於ocl程式設計藝術:

經常發生的錯誤錯誤:更新丟失,舊資料更新了最新的資料。

解決問題的方法:

在oracle中看好悲觀鎖(取決於oracle鎖開銷小,高併發),但在其他的資料庫已deprecated

悲觀鎖:在使用者有意執行更新等dml操作之前,就在行上加鎖for update nowait

悲觀鎖的結果:

給資料加鎖,其他使用者可以訪問,但是不可以修改記錄

當其他使用者正在更新,則會得到ora-00054:resource busy

得到0行,說明此列已經被修改,

**:scott@ora10g> select empno, ename, sal

2 from emp

3 where empno = :empno

4 and ename = :ename

5 and sal = :sal

6 for update nowait

7 /empno ename sal

---------- ---------- ----------

7934 miller 1300

scott@ora10g> update emp

2 set ename = :ename, sal = :sal

3 where empno = :empno;

1 row updated.

scott@ora10g> commit;

樂觀鎖:

1只在更新的時候,儲存著所有舊的值,用所有舊的值去查詢記錄來更新

樂觀鎖的結果:

成功更新資料

更新0條資料,說明更新的資料已經被更新了,需要新增附加的解決衝突的策略

**:update table

set column1 = :new_column1, column2 = :new_column2, ....

where primary_key = :primary_key

and column1 = :old_column1

and column2 = :old_column2

2為表新增一列,當更新時,列值相同可執行更新,若不同則更新過時,新增解決衝突策略。一般使用trigger來維護這一列的值,在update時,更新這一列值。但是出發器的開銷太大,為了實現這樣的功能小用牛刀。

3使用校驗和的樂觀鎖定:

(單向雜湊函式取乙個變長輸入串(即資料),並把它轉換為乙個定長的輸出串(通常更小),這個輸出稱為雜湊值(hash value)。雜湊值充當輸入資料的乙個惟一識別符號(就像指紋一樣)。可以使用雜湊值來驗證資料是否被修改)

實現方法:

owa_opt_lock.checksum

dbms_obfuscation_toolkit.md5

dbms_crypto.hash

這種方面消耗cpu較多,但是網路傳輸量小。

4ora_rowscn的樂觀鎖定

ora

ora_rowscn預設是塊級的,要設定支援行

create table dept

(deptno, dname, loc, data,

constraint dept_pk primary key(deptno) )

rowdependencies

as select deptno, dname, loc, rpad('*',3500,'*')

from scott.dept;

oracle 悲觀鎖 樂觀鎖

為了得到最大的效能,一般資料庫都有併發機制,不過帶來的問題就是資料訪問的衝突。為了解決這個問題,大多數資料庫用的方法就是資料的鎖定。資料的鎖定分為兩種方法,第一種叫做悲觀鎖,第二種叫做樂觀鎖。什麼叫悲觀鎖呢,悲觀鎖顧名思義,就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開...

Oracle 樂觀鎖 悲觀鎖

oracle有悲觀鎖也有樂觀鎖。悲觀鎖比較安全一些,可以防止丟失更新,但是就是互相等待,影響效率。一般會用樂觀鎖,即開始操作時,樂觀的認為資料不會被其他人更改,直到提交時才加鎖檢查。比如在操作的表上加一列,儲存個時間戳,提交時檢查是不是最新的。不過樂觀鎖失敗的可能性比較大。樂觀鎖,大多是基於資料版本...

悲觀鎖與樂觀鎖

悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...