oracle併發與多版本控制

追求完美9196發表於2024-06-17

1 相關概念

1.1 併發控制

資料庫對多個使用者同時查詢或者運算元據的管理。

1.2 多版本控制

oracle能物化多個版本的資料,使在一個時間點讀一個表,保證在這個時間點讀到的表資料是一致的。oracle的多版本控制機制是oracle提供讀一致性的基礎。

1.3 事務的作用

事務使資料庫從一種一致性狀態轉變為另外一種一致性狀態。

2 事務的隔離級別

併發訪問可能導致的三種現象。

  • 髒讀:讀到別的事務中沒有提交的資料
  • 不可重複讀:一個時間點讀取到的一行資料和在另外一個時間點讀到同一行的資料不一致。
  • 幻讀:一個時間點讀到的資料的行數,同樣的查詢條件在另外一個時間點讀取,發現行數增加了。
    根據併發訪問可能導致的三種現象,定義事務的4種隔離級別

    讀未提交:可以讀取別的事務中未提交的資料
    讀已提交:不能讀取別的事務中未提交的資料,只能讀取別的事務中已提交的資料
    可重複讀:保證不同時間點讀取同一行資料,資料不會發生變化
    可序列化:同樣的查詢條件,不同的時間點查詢,資料和資料量都不會發生變化

3 oracle多版本控制機制

3.1 舉例說明多版本控制機制

假設我們要查詢這麼一個表
select sum(account_balance) from accounts;
假設在查詢開始前,資料如圖7.2所示

SELECT語句開始執行,讀取第1行、第2行等。在查詢中的某個時刻,一個事務將$400.00從賬戶123轉到賬戶987。這個事務完成了兩個更新, 但是並沒有提交。現在的資料表如圖7-3所示。

此時發生更新的兩行資料已被鎖定,如果有人試圖更新這兩行,該使用者就會被阻塞。
我們執行的查詢要訪問一個資料塊,這個資料塊中包含表最後已鎖定的行(第34023行), 此時它應該會發現這一行中的資料在此查詢開始執行之後有所改變。為了提供一個一致的答案,Oracle在這個時刻會複製這個塊的資料到資料庫快取記憶體,然後根據undo資料回滾複製的塊的資料,回滾到剛開始查詢那一刻這個塊已提交的資料。然後就可以讀取到開始查詢那一刻的資料(100),而不是讀取修改後的資料(500)。這樣統計出來的資料就能保證一致性。

3.2 長時間的查詢導致I/O異常

一個耗時很長的SQL可能會導致I/O上升的非常高,因為這個sql在查詢後面的塊時,因為時間已過去很久,所以這些塊很可能已經被別的事務修改過,oracle需要複製這些塊,使用undo資訊回滾這些複製的塊,是複製的塊的資料回滾到剛開始查詢的樣子。而複製和回滾的操作可能需要I/O獲取。而且,如果undo資訊已過期,即oracle無法根據undo資訊回滾,就會報'ORA-1555 snapshot too old'的錯誤。

3.3 oracle重啟動

重啟動是指當前事務修改另外一個事務中沒提交的資料,當前事務會阻塞,直到另外一個事務提交。另外一個事務提交後,當前事務執行sql,但是資料已經修改。所以當前事務會回滾這個sql再重新執行一遍sql。
重啟動現象的案例:https://blog.51cto.com/webseven/1590985

相關文章