簡體   English   中英

事務可序列化隔離級別

[英]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。

  1. 這是因為 T1 創建的快照

是的

  1. 這個快照的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM