[英]Differences between TRANSACTION's levels: READ WRITE and ISOLATION LEVEL SERIALIZABLE
[英]Transaction Serializable Isolation Level
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
ALTER SESSION 設置 ISOLATION_LEVEL = SERIALIZABLE;
問題1 :
T1 (事務 1)和T2 (事務 2)
T1 : select * 來自 tableName where status = 'A';
T2 : 插入 tableName(id, status) 值 (1, 'I');
T2 :提交;
T1 : select * 來自 tableName where status = 'I'; // 為什么T1不能得到T2提交的狀態為I 的記錄? 這是因為T1創建的快照,這個快照的scope是什么,整個表?
問題2 :
T1 : 插入 tableName(id, status) 值 (1, 'I');
T2 : 插入 tableName(id, status) 值 (1, 'I'); // 如果 id 是唯一的,則 T2 被阻塞。 為什么T2被擋住了? 因為據我所知,兩個事務都會創建一個快照,即使它們還沒有提交。
在這種情況下,參與者是否有任何鎖? 謝謝。
T1: select * from tableName where status = 'I'; // 為什么T1 不能得到T2 提交的狀態為我的記錄? 這是因為T1創建的快照,這個快照的scope是什么,整個表?
因為 SERIALIZE 事務可以看到在事務開始之前提交的數據或事務本身所做的任何更改。 這就是 T1 無法看到在 T1 事務啟動后插入的記錄 I 的原因。
回答你的第二個問題,
T2:插入 tableName(id, status) 值 (1, 'I'); // 如果 id 是唯一的,則 T2 被阻塞。 為什么T2被封鎖了? 因為我知道,兩個事務都創建了一個快照,他們甚至還沒有提交。
即使兩個事務都是 SERIALIZE,Oracle 保持完整性並且不允許違反任何約束。 因此,您不能在違反任何約束的 T2 事務中添加記錄 I。
- 這是因為 T1 創建的快照
是的
- 這個快照的 scope 是什么,整張桌子?
SCN
問題2:為什么T2被阻塞了?
因為您有唯一或主鍵約束並且它沒有被延遲。
遵循 SERIALIZABLE 的含義:
可序列化。 這通常被認為是最嚴格的事務隔離級別,但它提供了最高程度的隔離。 SERIALIZABLE 事務在使其看起來好像沒有其他用戶修改數據庫中的數據的環境中運行。 確保您讀取的任何行在重新讀取時都是相同的,並且您執行的任何查詢都保證在事務的生命周期內返回相同的結果。
問題 1
所以在 T1 中你不會得到 T2 所做的任何更改,因為你的事務級別是 SERIALIZABLE。 該隔離級別可確保您的查詢始終返回相同的結果。 無論查詢運行了多長時間,其他事務所做的副作用或更改對查詢都是不可見的。
可序列化隔離適用於環境:
關於您的第二個問題,執行提交后該行將被鎖定,但該行對於 T2 不可見。
更多信息和一個很好的例子:
https://docs.oracle.com/cd/E25054_01/server.1111/e25789/consist.htm#BABCJIDI
9.3 可序列化事務中的讀一致性和序列化訪問問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.