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