oracle資料庫併發二

2021-08-30 16:49:03 字數 2059 閱讀 3408

如果乙個會話持有某個資源的鎖,而另乙個會話在請求這個資源,就會出現阻塞(blocking )。這樣一來,請求的會話會被阻塞,它會「掛起」,直至持有鎖的會話放棄鎖定的資源。

資料庫中有5 條常見的dml 語句可能會阻塞,具體是:insert 、update 、delete 、merge 和select for update 。對於乙個阻塞的select for update ,解決方案很簡單:只需增加nowait 子句,它就不會阻塞了。 例子

時間點session1

session2 t1

開始事務

t2 開始事務 t3

update a set col1=2 where id=1

獲得id 為1 的行的排它鎖(x )t4

update a set col1=5 where id=1

等待session1 釋放id 為1 的行的排它鎖(x )t5

commit

t6 commit

在上面的例子中

session1 在t3 時刻獲得id 為1 的行的排它鎖(x), 在t4 時刻,session2 也要更新該行,也要在行上加排它鎖(x ),由於session1 的事務還沒有提交,因此session2 這個時候就被阻塞了,只到session1 的事務提交或回滾後session2 也獲得此行的排它鎖(x )使事務得以進行。 例子

時間點session1

session2 t1

開始事務

t2 開始事務 t3

update a set col1=2 where id=1

獲得id 為1 的行的排它鎖(x )

t4 update b set col1=5 where id=4

獲得id 為4 的行的排它鎖(x )t5

update b set col1=6 where id=4

等待session2 釋放id 為4 的行的排它鎖(x )

t6 update a set col1=8 where id=1

等待session1 釋放id 為1 的行的排它鎖(x )t7

commit

t8 commit

在上面的例子中

session1 在t3 時刻獲得表a 的id 為1 的行的排它鎖(x), 在t4 時刻,session2 獲得表b 的id 為4 的行的排它鎖(x),t5 時刻,session1 要更新表b 的id 為4 的行,要在行上加排它鎖(x ),由於session2 的事務還沒有提交,因此session1 這個時候就被阻塞了,t6 時刻session2 要更新表a 的id 為1 的行,要在行上加排它鎖(x ),由於session1 的事務還沒有提交,因此session2 這個時候就被阻塞了,這時兩個會話都被對方阻塞了於是死鎖就發生了。

在oracle 中,oracle 會自己檢測死鎖,一旦檢測到就會回滾該語句,在這個例子中oracle 會在t6 時刻檢測到死鎖並回滾該語句,但session2 在t4 上仍然保持著鎖,因此session1 還是不能繼續進行。

即使對同乙個表操作也會出現死鎖的情況

時間點session1

session2 t1

開始事務

t2 開始事務 t3

update a set col1=2 where id=1

獲得id 為1 的行的排它鎖(x )

t4 update a set col1=5 where id=4

獲得id 為4 的行的排它鎖(x )t5

update a set col1=6 where id=4

等待session2 釋放id 為4 的行的排它鎖(x )

t6 update a set col1=8 where id=1

等待session1 釋放id 為1 的行的排它鎖(x )t7

commit

t8 commit

oracle資料庫事務併發操作

1 丟失資料修改 當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。2 讀 髒 資料 髒讀 讀 髒 資料是指事務t1修改某一資料,並將其寫回磁碟,事務t2讀取同一資料後,t1由於某種...

資料庫併發

資料庫併發定義 乙個處理機處理乙個事務,系統允許多個處理機處理多個事務,稱為併發 併發引起的影響 1.修改丟失 事務1和事務2同時操作某條資料,比如機場共有機票16張,事務1賣出一張後修改為15,同時事務2也賣出1張,修改為15,最後資料庫中票量為15,實際只剩14個座位 2.不可重複讀 事務1第一...

oracle資料庫的併發初步理解

從這個列子我們來分析,資料庫併發的概念。我們再來了解這兩個名詞的含義。訪問使用者數 乙個大型的 每天肯定是有很多人訪問的,每當有人進入這個 時,訪問數就會加一,這就造成了訪問數很大。有人訪問,進入這個 肯定就是要查詢資料庫的,除非是純靜態的 一人訪問就會連線一次資料庫,從裡面拿出資料,這個時候就有併...