確定合適的隔離級別
這是一個家庭作業問題。
對於以下事務,說明將在不降低數據庫完整性的情況下最大化吞吐量的隔離級別。解釋答案。
將由 coursed_id = ‘CPSC1350’ 標識的課程從一個部門更改為不同的部門。
Courses 表包含有關課程的資訊:他們的 id、他們的名字、提供它的部門、其講師的 id 以及可以參加的最大學生人數 (max_size)。Courses(coursed_id: string, cname: string, dept: string,instructor_id: string, max_size:integer) – 主鍵:coursed_id – 外鍵:instructor_id 參考講師
假設使用 PostgreSQL。
我相信事務可以使用已送出的讀取來完成,因為
- 臟讀不正常,因為正在進行更新,因此涉及讀取
- 不可重複讀取是可以的,因為其他人不太可能更改值
- 幻影是可以的,因為沒有
SELECT
陳述我在正確的軌道上嗎?
這個問題看起來很簡單,但可能不是那麼簡單,或者它只是假裝很複雜……我會盡力回答它,因為我理解它。如果我誤解了一些明顯的提示,我深表歉意。
使用 PostgreSQL,沒有真正的
Read uncommitted
- 你得到Read committed
. 引用文件:在 PostgreSQL 中,您可以請求四種標準事務隔離級別中的任何一種,但在內部只實現了三種不同的隔離級別,即 PostgreSQL 的
Read Uncommitted
模式行為類似於Read Committed
. 這是因為這是將標準隔離級別映射到 PostgreSQL 的多版本並發控制架構的唯一明智的方法。這個問題對我來說聽起來不是很清楚,因為當您有同時查詢並且沒有提到其他查詢時,隔離級別很重要,所以如果我錯過了什麼,請不要過分責備我。
如果我們將剩餘的隔離級別按“已送出讀”->“可重複讀”->“可序列化”的順序排列,成本會相應增加。所以我們需要以相同的順序檢查它們,一旦我們滿意,就不需要檢查剩餘的級別(它們會很好,但成本更大)。據我了解,
UPDATE Courses set dept = 'New department' coursed_id = ’CPSC1350’
是否進行了所需的工作。從 描述讀取已送出隔離級別的Postgre 文件中,UPDATE、DELETE、SELECT FOR UPDATE 和 SELECT FOR SHARE 命令在搜尋目標行方面的行為與 SELECT 相同:它們只會找到在命令開始時送出的目標行。但是,這樣的目標行在找到時可能已經被另一個並發事務更新(或刪除或鎖定)。在這種情況下,可能的更新程序將等待第一個更新事務送出或回滾(如果它仍在進行中)。如果第一個更新程序回滾,則其效果被否定,第二個更新程序可以繼續更新最初找到的行。如果第一個更新程序送出,如果第一個更新程序刪除了該行,則第二個更新程序將忽略該行,否則它將嘗試將其操作應用於該行的更新版本。重新評估命令的搜尋條件(WHERE 子句)以查看行的更新版本是否仍然匹配搜尋條件。如果是這樣,則第二個更新程序使用該行的更新版本繼續其操作。
我想說我對這種情況下的行為感到滿意,所以
READ COMMITTED
除非問題中沒有提到其他限制,否則我會繼續。