天天看點

DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

,并發性和間隔級别,當多個使用者通路碰面統一資料庫時會産生的現象,在單使用者情形中,每個事宜都是順序執行的,而不會遇到與其他事宜的辯論。可是,在多使用者情形下,多個事宜可以(而且常日)同時執行。是以每個事

DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

并發性和間隔級别

當多個使用者通路碰面統一資料庫時會産生的現象

在單使用者情形中,每個事宜都是順序執行的,而不會遇到與其他事宜的辯論。可是,在多使用者情形下,多個事宜可以(而且常日)同時執行。是以每個事宜都有能夠與其他正在運轉的事宜産生辯論。有能夠與其他事宜産生辯論的事宜稱為交錯的 或并行的 事宜,而互相間隔的事宜稱為串行化 事宜,這意味着同時運轉它們的成效與一個接一個繼承地運轉它們的成效沒有差別。在多使用者情形下,在運用并行事宜時,會産生四種現象:

  • 損掉更新: 這種情形産生在兩個事宜讀取并考試考試更新統一資料時,此中一個更新會損掉。譬喻:事宜 1 和事宜 2 讀取統一行資料,并都憑證所讀取的資料較量争論出該行的新值。如果事宜 1 用它的新值更新該行此後,事宜 2 又更新了統一行,則事宜 1 所執行的更新操縱就損掉了。因為詭計 DB2 的體例,DB2 不容許産生此類現象。
  • 髒讀: 當事宜讀取尚未送出的資料時,就會産生這種情形。譬喻:事宜 1 變革了一行資料,而事宜 2 在事宜 1 送出變革之前讀取了已變革的行。如果事宜 1 復原該變革,則事宜 2 就會讀取被以為是未曾存在的資料。
  • 不可反複的讀: 當一個事宜兩次讀取統一行資料,但每次掉掉不同的資料值時,就會産生這種情形。譬喻:事宜 1 讀取了一行資料,而事宜 2 在變革或删除該行後送出了變革。當事宜 1 考試考試再次讀取該行時,它會檢索到不同的資料值(如果該行已經被更新的話),或發現該行不複存在了(如果該行被删除的話)。
  • 幻像: 當最初沒有看到某個與搜刮條件婚配的資料行,而在稍後的讀操縱中又看到該行時,就會産生這種情形。譬喻:事宜 1 讀取滿足某個搜刮條件的一組資料行,而事宜 2 拔出了與事宜 1 的搜刮條件婚配的新行。如果事宜 1 再次執行産生原先行集的盤問,就會檢索到不同的行集。

維護資料庫的對等性和資料完好性,同時又允很多個使用順序同時通路碰面統一資料,如許的特征稱為并發性。DB2 資料庫用來考試考試強迫實行并發性的體例之一是颠末運用間隔級别,它決意在第一個事宜通路碰面資料時,如何對其他事宜鎖定或間隔該事宜所運用的資料。DB2 運用下列間隔級别來強迫實行并發性:

  • 可反複的讀(Repeatable Read)
  • 讀波動性(Read Stability)
  • 遊标波動性(Cursor Stability)
  • 未送出的讀(Uncommitted Read)

可反複的讀間隔級别可以灌注掃數現象,可是會大大高漲并發性的水準(可以同時通路碰面統一本錢的事宜數目)。未送出的讀間隔級别供應了最大的并發性,可是後三種現象都能夠出現。

DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

可反複讀間隔級别

可反複讀間隔級别是最嚴酷的間隔級别。在運用它時,一個事宜的影響完全與其他并發事宜間隔:髒讀、不可反複的讀、幻像都不會産生。當運用可反複的讀間隔級别時,在事宜執行時期鎖定該事宜以任何體例 援用的掃數行。是以,如果在統一個事宜中發出統一個 SELECT 語句兩次或更屢次,那麼産生的成效資料集總是雷同的。是以,運用可反複的讀間隔級别的事宜可以屢次檢索統一行集,并可以對它們執行随便操縱,直到由送出或復原操縱終了事宜。可是,在事宜存在時期,不容許其他事宜執行會影響這個事宜正在通路碰面的任何行的拔出、更新或删除操縱。為了確定這種舉動,鎖定該事宜所援用的每一行 —— 而不是僅鎖定被理想檢索或修正的那些行。是以,如果一個事宜掃描了 1000 行,但隻檢索 10 行,則所掃描的 1000 行(而不可是被檢索的 10 行)都會被鎖定。

那麼在現本相況中可反複讀間隔級别是如何任務的呢?假定您運用 DB2 資料庫跟蹤旅舍記載,包括房間預訂和房價資訊,另有一個基于 Web 的使用順序,它容許主顧按 “先到先就事” 的準繩預訂房間。如果旅舍預訂使用順序是在可反複讀間隔級别下運轉的,當主顧掃描某個日期段内的可用房間清單時,您(旅舍司理)将無法變革那些房間在指定日期範疇内的房價。異常,其他主顧也無法中止或消除将會變革該清單的預訂(直到第一個主顧的事宜終了為止)。可是,關于生成第一個主顧的清單時沒有讀取的任何房間記載,您可以修正房價。異常,其他主顧也可以中止或消除這些房間的預訂。圖 2 申明晰明晰這種舉動。

圖 2. 可反複讀間隔級别的示例
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

讀波動性間隔級别

讀波動性間隔級别沒有可反複讀間隔級别那麼嚴酷;是以,它沒有将事宜與其他并發事宜的成效完全間隔。讀波動性間隔級别可以灌注髒讀和不可反複的讀,可是能夠出現幻像。在運用這個間隔級别時,隻鎖定事宜虛際檢索和修正的行。是以,如果一個事宜掃描了 1000 行,但隻檢索 10 行,則隻需被檢索的 10 行(而不是所掃描的 1000 行)被鎖定。是以,如果在統一個事宜中發出統一個 SELECT 語句兩次或更屢次,那麼每次産生的成效資料集能夠不同。

與可反複讀間隔級别一樣,在讀波動性間隔級别下運轉的事宜可以檢索一個行集,并可以對它們執行随便操縱,直到事宜終了。在這個事宜存在時期,其他事宜不克不及執行那些會影響這個事宜檢索到的行集的更新或删除操縱;可是其他事宜可以執行拔出操縱。如果拔出的行與第一個事宜的盤問的選擇條件婚配,那麼這些行能夠作為幻像呈現在後續産生的成效資料齊集。其他事宜對其他行所做的變革,在送出之前是不可見的。

那麼,讀波動性間隔級别會如何影響旅舍預訂使用順序的任務體例呢?當一個主顧檢索某個日期段内的掃數可用房間清單時,您可以變革這個主顧的清單之外的任何房間的房價。異常,其他主顧可以中止或消除房間預訂,如果第一個主顧再次運轉異常的盤問,其他主顧的操縱能夠會影響他掉掉的可用房間清單。如果第一個主顧再次盤問統一個日期段内的掃數可用房間清單,産生的清單中有能夠包括新的房價或第一次産生清單時不可用的房間。圖 3 申明晰明晰這種舉動。

圖 3. 讀波動性間隔級别的示例
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

遊标波動性間隔級别

遊标波動性間隔級别在間隔事宜成效方面非常寬松。它可以灌注髒讀;但有能夠出現不可反複的讀和幻像。這是因為在大多半情形下,遊标波動性間隔級别隻鎖定事宜聲明并掀開的遊标此後盾用的行。

當運用遊标波動性間隔級别的事宜颠末遊标從表中檢索行時,其他事宜不克不及更新或删除遊标所援用的行。可是,如果被鎖定的行自身不是用索引通路碰面的,那麼其他事宜可以将新的行添加到表中,以及對被鎖定行前後的行中止更新和/或删除操縱。所擷取的鎖不時有效,直到遊标重定位或事宜終了為止。(如果遊标重定位,本來行上的鎖就被開釋,并掉掉遊标現在援用的行上的鎖。)另外,如果事宜修正了它檢索到的任何行,那麼在事宜終了之前,其他事宜不克不及更新或删除該行,縱然在遊标不再位于被修正的行。與可反複讀和讀波動性間隔級别一樣,其他事宜在其他行上中止的變革,在這些變革送出之前關于運用遊标波動性間隔級别的事宜(這是默許的間隔級别)是不可見的。

如果旅舍預訂使用順序在遊标波動性間隔級别下運轉,那麼有什麼影響呢?當一個主顧檢索某個日期段内掃數可用房間的清單,然後檢視關于産生的清單上每個房間的資訊時(每次檢視一個房間),您可以變革旅舍中任何房間的房價,可是這個主顧此後正在檢視的房間除外 (關于指定的日期段)。異常,其他主顧可以對任何房間中止或消除預訂,可是這個主顧此後正在檢視的房間除外 (關于指定的日期段)。可是,關于第一個主顧此後正在檢視的房間記載,您和其他主顧都不克不及中止任何操縱。當第一個主顧檢視清單中另一個房間的資訊時,您和其他主顧就可以修正他剛才檢視的房間記載(如果這個主顧沒有預訂這個房間的話);但不克不及修正第一個主顧此後正在檢視的房間記載。圖 4 申明晰明晰這種舉動。

圖 4. 遊标波動性間隔級别的示例
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

未送出的讀間隔級别

未送出的讀間隔級别是最不嚴酷的間隔級别。理想上,在運用這個間隔級别時,僅當另一個事宜試圖删除或變革被檢索的行所在的表時,才會鎖定一個事宜檢索的行。因為在運用這種間隔級别時,行常日堅持未鎖定狀況,以是髒讀、不可反複的讀和幻像都能夠會産生。是以,未送出的讀間隔級别常日用于那些通路碰面隻讀表和視圖的事宜,以及某些執行 SELECT 語句的事宜(隻需其他事宜的未送出資料對這些語句沒有負面成效)。

望文生義,其他事宜對行所做的變革在已經送出之前關于運用未送出的讀間隔級别的事宜是可見的。可是,此類事宜不克不及看見或通路碰面其他事宜所建立的表、視圖或索引,直到那些事宜被送出為止。雷同地,如果其他事宜删除了現有的表、視圖或索引,那麼僅當中止删除操縱的事宜終了時,運用未送出的讀間隔級别的事宜才力知道這些工具不再存在了。(肯定要留意一點:當運轉在未送出的讀間隔級别下的事宜運用可更新遊标時,該事宜的舉動和在遊标波動性間隔級别下運轉一樣,并使用遊标波動性間隔級别的束厄狹窄。)

那麼未送出的讀間隔級别對旅舍預訂使用順序有什麼影響呢?現在,當一個主顧檢索某個日期段内的掃數可用房間清單時,您可以變革旅舍中任何房間任何日期的房價,而其他主顧也可以對任何房間中止或消除預訂,包括第一個主顧此後正在檢視的房間記載(關于指定的日期段)。另外,第一個主顧生成的房間清單能夠包括其他主顧正在預訂(是以理想上不可用)的房間。圖 5 申明晰明晰這種舉動。

圖 5. 未送出的讀間隔級别示例
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

選擇精确的間隔級别

運用的間隔級别不但影響資料庫對并發性的支援如何,而且影響并發使用順序的機能。常日,運用的間隔級别越嚴酷,并發性就越小,某些使用順序的機能能夠會越低,因為它們要等候本錢上的鎖被開釋。那麼,如何決意要運用哪種間隔級别呢?最好的體例是确定哪些現象是不可接收的,然後選擇可以灌注這些現象産生的間隔級别:

  • 如果正在執行大型盤問,而且不盼望并發事宜所做的修正招緻盤問的屢次運轉前去不同的成效,則運用可反複的讀間隔級别。
  • 如果盼望在使用順序之間掉掉肯定的并發性,還盼望限定的行在事宜執行時期堅持波動,則運用讀波動性間隔級别。
  • 如果盼望掉掉最大的并發性,同時不盼望盤問看到未送出的資料,則運用遊标波動性間隔級别。
  • 如果正在隻讀的表/視圖/資料庫上執行盤問,或許并不介意盤問能否前去未送出的資料,則運用未送出的讀間隔級别。
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)
DB2 9 根底(730 考試)認證指南,第 6 部分: 資料并發性(3)

指定要運用的間隔級别

隻管間隔級别節制事宜級上的舉動,但理想上是在使用順序級指定它們的:

  • 關于嵌入式 SQL 使用順序,在預編譯時或在将使用順序綁定到資料庫(如果運用延遲綁定)時指定間隔級别。在這種情形下,運用 PRECOMPILE 或 BIND 呼籲 的 ISOLATION 選項來設定間隔級别。
  • 關于開放資料庫銜接(Open Database Connectivity,ODBC)和調用級接口(Call Level Interface,CLI)使用順序,間隔級别是在使用順序運轉時颠末調用指定了

    SQL_ATTR_TXN_ISOLATION

    銜接屬性的

    SQLSetConnectAttr()

    函數中止設定的。(另外,也可以颠末指定 db2cli.ini 設定檔案中的 TXNISOLATION 樞紐字的值來設定 ODBC/CLI 使用順序的間隔級别;可是,這種體例缺乏靈敏,不克不及像第一種體例那樣為一個使用順序中的不同僚宜修正間隔級别。)
  • 關于 Java 資料庫銜接(Java Database Connectivity,JDBC)和 SQLJ 使用順序,間隔級别是在使用順序運轉時颠末調用 DB2 的 java.sql 銜接接口中的

    setTransactionIsolation()

    體例設定的。
SELECT * FROM EMPLOYEE WHERE EMPID = '001' WITH RR
           

繼續閱讀