存儲過程加鎖怎麼防止並發
⑴ 資料庫死鎖,並發問題
補充樓主:
其實我沒什麼經驗,只不過是了解一些基礎的東西罷了。
一樓的 一朵瘩紅花 實際經驗很豐富,你可以向她咨詢一下。
你問的問題挺好得。三個概念緊密聯系在一起。
這樣說吧:並發的幾個事務同時發生,不加鎖控制的話數據就會亂套了,而加了鎖後,又是並發訪問會出現死鎖,所以就會出現避免死鎖的一些措施。
首先談並發:理論指的是在一段時間同時對某件事進行操作。 注意精度問題,修改資料庫是在一段時間內操作,不是在某個時刻,而日誌則會從 時刻 開始記錄你的操作。
造成死鎖的原因是為了防止 不同的用戶同時間(不是時刻)都對某個數據修改,造成訪問不一致的問題。
比如你讀了資料庫的一個數據然後把它修改了並存回去,是需要時間的(假如是student表中的有個grade屬性,你改了一條記錄的一個值)在這個過程當中,有人又訪問了資料庫並且恰恰訪問的是存回去之前的數據,然後他要進行操作,過了一段時間,此時你已經存回去了數據。會發現原來的數據被改動了。這時數據就亂套了。(專業術語叫讀臟數據,其實還有很多其他類似這種導致前後數據不一致的問題)所以為了限定這種操作,資料庫設計了-----鎖---來鎖定這種操作。就是你正在操作某個數據的時候----通常之前會先鎖定這個數據,這樣別人就不能對此數據操作了(嚴格來說就是只能讀,不能改),必須等你操作完才能對此數據修改等操作,這就在一定程度上避免了前後操作數據不一致的問題。
但是有了鎖後,新問題出現了,就是死鎖:
簡單解釋死鎖:進程A等待進程B釋放他的資源,B又等待A釋放他的資源,這樣就互相等待就形成死鎖
官方解釋死鎖
死鎖,根本原因在於對共享存儲區的訪問。在資料庫中也一樣,如果需要「修改」一條數據,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有一個事務能進行修改操作。鎖有多種實現方式,比如意向鎖,共享-排他鎖,鎖表,樹形協議,時間戳協議等等。鎖還有多種粒度,比如可以在表上加鎖,也可以在記錄上加鎖。
在並發控制中,鎖是非常重要的。
至於在Oracle還是別的資料庫管理系統中,死鎖產生的原因沒有不同,不同的頂多是鎖的實現或者死鎖的恢復等罷了
再來說說事務:
事務簡單來說就是 一系列的對資料庫的操作揉在一起,要麼同時完成,要麼就都不完成。
比如---你要取錢的過程就可以當成是一個小的事務: 插卡,輸入取錢金額,取走錢,拿出來卡。此過程缺一不可。把所有這些過程細節封裝起來就成為一個事務。
以oracle資料庫為例:
一個事務(你可以認為是一系列業務的操作)起始於dml語句(insert、update、delete)
即一條dml語句就做為一個事務的起始,然後根據業務需要,進行其他的dml操作都算是事務的一部分。
最後碰到commit。或者rollback,或者其他意外什麼的都算作一個事務的結束。
整個過程就是一個事務。
事務的理論解釋就是那四個什麼特性:什麼原子性、一致性、隔離性和持久性
簡稱ACID
剩下的:資料庫是建立在操作系統之上的一個層次。
你問的是資料庫的存儲機制??工作機制??還是什麼的??
資料庫就是存數據的。資料庫管理系統是 對存的數據進行高效率的管理
大的結構分物理數據跟邏輯數據。
物理數據就是數據在存儲設備上的存儲方式,什麼物理聯系,物理結構,物理記錄等 術語。
邏輯數據就是程序員和用戶看到的數據形式。什麼邏輯聯系,邏輯結構==同上
資料庫管理類系統就是把這些邏輯跟物理相互轉換。 好比你輸入的叫邏輯數據存儲在磁碟上叫物理數據。等等。
廢話了一堆,也不知道回答對你的問題沒~~
⑵ java防止並發的幾種方法
使用synchronized關鍵字3種使用方法:
修飾類方法,作用於當前實例加鎖,進入方法要獲取當前實例的鎖
修飾靜態方法,作用於當前實例加鎖,進入方法要獲取當前實例的鎖
修飾代碼塊,指定加鎖對象,給指定對象加鎖,進入代碼塊要先獲取指定對象的鎖(synchronized參數要傳入固定的對象才能起到作用)
使用原子操作:
java 在 SDK atomic包下的提供了原子操作的類,常用的有
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicIntegerFieldUpdater
AtomicLong
AtomicLongArray
AtomicLongfieldUpdater
AtomicMarkableReference
AtomicReference
AtomicReference
AtomicReferenceArray
AtomicReferenceFieldUpdater
AtomicStampedReference
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
Striped64
其中atomicboolean atomicinteger atomicreperence常用的方法及含義
get() 獲取當前值
set()設置當前值
getAndSet(V newValue) 獲取當前值並設置最新的值
compareAndSer(V expect,V update)如果expect與當前值相同就設置update為最新值
⑶ 存儲過程並發,存儲過程在同一個時間裡面執行了多次,導致數據多次修改
這個問題顯然不應該去資料庫查,你最先應該看前端是否有重復提交的限制,或者直接在後台加安全鎖。
⑷ java處理高並發時,使用synchronized代碼鎖防止同時對資料庫某一數據的問題。
首先synchronized不可能做到對某條資料庫的數據加鎖。它能做到的只是對象鎖。
比如數據表table_a中coloum_b的數據是臨界數據,也就是你說的要保持一致的數據。你可以定義一個類,該類中定義兩個方法read()和write()(注意,所有有關該臨界資源的操作都定義在這個類中),再定義一個靜態變數作為鎖就可以了。
public static final String LOCK = "table_a_b_lock";
public int read(){
synchronized LOCK{
System.out.println("read data...");
}
}
public void write(String data){
synchronized LOCK{
System.out.println("write data:" + data);
}
}
另外,還可以在資料庫級別加上鎖。資料庫本來就支持不同的隔離級別。