當多使用者同一時刻訪問相同的資料庫資源時,將產生併發。併發極易破壞資料的一致性。鎖定是處理併發的重要手段,使用者在修改某一資源前,必須首先獲得資源的修改權。而這種修改權具有排他性。
更新表中記錄首先獲得該記錄上的排它鎖,從而防止兩個程序同時修改同一條記錄。
update students set student_name='張軍' where student_id=16;
當使用者更新記錄時,將獲得在該記錄上的排它鎖,只有事務結束,該鎖定才會被釋放。
死鎖是指2個程序都嘗試獲取對方已獲得的鎖,從而導致雙方互相等待。如果沒有對應的處理措施,那麼這種狀態將一直持續下去。
當死鎖發生時,oracle總是自動檢測死鎖,並強制其中乙個事務放棄原任務,這樣,只保證其中乙個事務能夠正常完成。
鎖分為2種:悲觀鎖和樂觀鎖。
悲觀鎖是指,當前程序在每次更新資料時,總是假設有其他程序正在鎖定同一資源;
樂觀鎖則假定不存在鎖定請求資源的其他程序。
鎖定表中記錄可以利用for update
select * from students where student_id=1 for update
在鎖定時利用nowait,指定資料庫不必等待,直接放棄鎖定操作
select * from students where student_id=1 for update nowait
此時會報錯,表示資源忙,鎖定失敗,如果不加nowait,該程序會一直等待第乙個程序釋放資源。
a使用者和b使用者同時修改乙個記錄時
更新資料時的併發問題的解決辦法為將表的所有列作為過濾條件。
update students set student_age=20 where student_id=1 and student_name='金瑞' and student_age=26 and status='cxl'
由於b使用者已經修改了資料。a使用者用原來的資料作為條件更新時,就匹配不到這條記錄,所以a會更新失敗。
除了利用所有列作為過濾條件外,可以利用version列實現相同功能
1.給表students中新增列version,預設值為0
alter table students and version number default 0;
2.更新時,將version列加入過濾條件
update students set student_age=19 where student_id=1 and version=0;
3.再執行update students set version=version+1 where student_id=1 and version=0;
第三種方式是利用時間戳列來代替version列,並將時間戳加入過濾條件、每次更新成功,利用當前時間戳來更新時間戳列
乙個資料庫中,某一時刻可能存在著多個鎖,而且,當資料庫狀態發生改變時,鎖的數量也可能隨之膨脹。在sql server中,利用鍊錶來維護和管理鎖。當乙個事務中的鎖的數量達到公升級門限時,sql進行鎖定公升級,而oracle則完全摒棄了這種做法。
sql server 所能管理的鎖的數量是有限制的。當某個表上鎖定超過了一定數量,sql server通過提公升鎖的粒度來減少鎖定的數量。例如,students表上可能有多個行級鎖,當鎖的數量達到一定極限時,這些行級鎖將被轉換為乙個表級鎖。通過這種方式,sql server將資料庫的鎖的數量維持在某個水平之下。
鎖定公升級的好處是可以很容易的維護鎖的數量,但是由於乙個獨佔鎖在同一時刻只能為乙個事務所擁有,因此,鎖定公升級往往以損失事務併發為代價。
oracle的鎖定資訊是以屬性的形式,直接儲存於資料款和資料行(表記錄)之上。換句話說,oracle資料的儲存結構已經為是否鎖定、鎖的型別,以及被哪個事務鎖定等資訊預留了儲存空間。無論一條記錄是否被鎖定,都會有相應的標誌位進行標識。每當乙個事務嘗試在某些資料上加鎖時,首先要訪問資料本身的標誌位,以驗證是否允許鎖定。
這樣,在乙個事務中,為1條記錄和為100天松記錄新增行級鎖,oracle維護的空間及開銷是大致相同的。事實上,oracle只是新增乙個鎖,並更新被鎖定資料本身的屬性資訊。因為沒有鎖列表的存在,oracle也不必進行鎖定公升級。
鎖定轉換的意義在於,對於乙個dml操作,如果需要進行資料鎖定,oracle總是盡量使鎖的獨占性最低。當真正需要進行資料操作時,才會將獨占性提高。也就是說,oracle所建立的鎖總是保持著『夠用即可』的狀態,以儘量減少對其他事務請求同一資源時的影響。
悲觀鎖適合併發數不大的情況下。
樂觀鎖適合併發較高的情況。
Oracle併發與多版本控制
1.什麼是併發 2.事務隔離級別 2.1 read uncommitted 2.2 read committed 2.3 repetable read 2.4 serializable 2.5 read only 3.多版本讀一致性含義 4.寫一致性 1.多版本控制是指,oracle能同時物化多個版...
mysql 併發控制 mysql併發控制
mysql併發控制 當有多個查詢需要同時修改同乙個資料,就會產生併發控制的問題。mysql可以在兩個層面進行併發控制 伺服器層和儲存引擎層。mysql通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...
事務併發 併發控制(加鎖)
事務處理中的併發控制 1.併發操作 資料庫是乙個共享資源,允許多個使用者程式並行地訪問資料庫,所以當多個使用者併發地訪問同一資料,就可能出現資料的不一致性。例如 假設有兩個事務 t1 和 t2 它們都需要讀出並修改資料 a 其執 況如下所示 執行順序 1 2 3 4 5 6 事務t1 讀aa a 1...