三種現象:
- 脹讀取:一個事物讀取了被其他事物寫入但未提交的資料
- 不可重複讀取:一個事物再次讀取曾經讀取過,探索資料已經被其他已經提交的事物修改或者刪除
- 不存在讀取:事物按照之前查詢條件重新查詢,返回的結果集中包含其他已提交事務插入滿足條件的新資料
SQL92標準的隔離等級
| |
|
|
|
| 現象 |
髒讀取 |
不可重複讀取 |
不存在讀取 |
| 隔離等級 |
|
| 未提交讀取(read uncommitted) |
允許 |
允許 |
允許 |
| 已提交讀取(read committed) |
不允許 |
允許 |
允許 |
| 可重複讀取(repeatable read) |
不允許 |
不允許 |
允許 |
| 序列化(rerializable) |
不允許 |
不允許 |
不允許 |
|
Oracle支援交易隔離等級已提交讀取:序列化:序列化隔離的事務只能看到事務執行前就已經提交資料,以及事務內Insert、Update、及delete語句對資料的修改。序列化隔離的事務不會出現不可重複讀取或不存在的讀取的現象唯讀模式:唯讀事務只能看到事務執行前就已經提交的資料,且事務中不能執行Insert、Update及Delete語句set transaction isolation level read commitedset transaction isolation level serializableset transaction read only髒資料就是讀到database buffer cache做了修改但還沒有寫到datafile裡面的資料,只要沒有寫入資料檔案,不管是否提交,都可以稱為髒資料。
鎖:是防止訪問相同資源的事務產生破壞性互動的機制
鎖模式:獨佔鎖定:能夠阻止共用被加鎖的資源。對資料進行修改時必須獲得此種模式的鎖。第一個排他地對資源加鎖的事務是唯一可以對此資源進行修改的事務,直至獨佔鎖定被釋放共用鎖定:依據操作類型有條件地允許共用被加鎖的資源。對資料進行讀取的多個使用者可共用此資料,這些使用者可以對資源加以共用鎖定,防止其他使用者並發地修改此資源。多個事務可以對相同的資源加共用鎖定
|
| 鎖 |
描述 |
|
DML 鎖(資料鎖) |
DML 的作用是保護資料。例如,表級鎖(table lock)對整個表加鎖,行級鎖(row lock)則對選定的資料行加鎖。 |
DDL 鎖(資料字典鎖) |
DDL 鎖的作用是保護方案對象的結構。例如,表及視圖的定義。 |
內部鎖(internal lock)及閂鎖(latch) |
內部鎖及閂鎖用於保護資料庫的內部結構,例如,資料檔案。內部鎖及閂鎖的管理完全由 Oracle 自動完成。 |
行共用表級鎖(row share table lock RS):表明擁有此鎖的事務鎖定了表內的某些資料行,並有意對資料進行更新操作SELECT....FROM table ....FOR UPDATE OF ......LOCK TABLE table IN ROW SHARE MODE允許操作:某個事務擁有了某個表的行共用表級鎖後,其他事務依然可以並發地對相同資料表執行查詢,插入,更新,刪除操作,或對錶內資料行加鎖的操作。也就是說,其他事務同時也能獲得相同表上的行共用鎖定,行排他共用,及共用行排他模式的表級鎖。禁止操作:某個事務擁有了某個表的行共用表級鎖後,只會禁止其他事務通過以下語句排他對相同表進行寫操作。LOCK TABLE table IN EXCLUSIVE MODE;行排他表級鎖(row exclusive table lock RX):通常表面擁有此鎖 的事務已經對錶內的某些資料進行了更新操作。INSERT INTO table.....UPDATE table.....DELETE FROM table.....LOCK TABLE table IN ROW EXCLUSIVE MODE;允許操作:某個事務擁有了某個表的行排他表級鎖後,其他事務依然可以並發地對相同資料表執行查詢,插入,更新,刪除操作,或對錶內資料行加鎖操作。即行排他表級鎖允許其他多個事務同時獲得相同表上的行共用表級鎖或行排他表級鎖禁止操作:某個事務擁有了某個表的行排他表級鎖後,將禁止其他事務手工地對錶加鎖進行排他地讀寫操作,因此其他語句不能對相同表加鎖LOCK TABLE table IN SHARE MODE;LOCK TABLE table IN SHAE EXCLUSIVE MODELOCK TABLE table IN EXCLUSIVE MODE;共用鎖定(share table lock S):LOCK TABE table IN SHAE MODE允許操作:某個事務擁有了某個表的共用表級鎖後,其他事務可以查詢表,可以使用select ......for update 語句鎖定選中的資料行,也能夠成功執行LOCK TABLE .......IN SHARE MODE 語句。但其他事務不能對錶進行更新操作。多個事務可以並發地獲得同一個表上的共用表級鎖,在此種情況下任何事務都不能對錶進行更新。因此,擁有共用表級鎖的事務只能在此表上沒有其他事務的共用表級鎖時,才能對錶進行更新操作禁止操作:某個事務擁有了某個表的共用級鎖後,將禁止其他事務修改此表,同時禁止其他事務執行以下語句LOCK TABLE table IN ROW EXCLUSIVE MODELOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;LOCK TABLE table IN EXCLUSIVE MODE;共用行排他表級鎖(share row exclusive table lock SRX):LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;允許操作:同一時間只有一個事務 能夠獲得表的共用行排他表級鎖,某個事務擁有了某個表的共用行排他表級鎖後,其他事務可以查詢表,可以使用select ....for update 語句鎖定選中的資料行,當不能對錶進行更新操作禁止操作:擁有共用行排他表級鎖的事務將阻止其他事務擷取行排他表級鎖來修改資料,共用行排他表級鎖還能阻止其他事務在相同表上擷取共用表鎖,共用行排他表級鎖及排他表級鎖LOCK TABLE table IN ROW EXCLUSIVE MODE;LOCK TABLE table IN SHARE MODE;LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;LOCK TABLE table IN EXCLUSIVE MODE;排他表級鎖(exclusive table lock X):LOCK TABLE table IN EXCLUSIVE MODE;允許操作:同一時間只有一個事務能獲得表上的排他表級鎖。一個事務獲得表級鎖後,其他事務只能對錶進行查詢操作禁止操作:一個事務獲得排他表級鎖後,將禁止其他事務對錶執行任何DML操作,其他事務無法擷取表上任何類型的鎖