欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > DB2和 Oracle的并發控制(鎖)的比較

DB2和 Oracle的并發控制(鎖)的比較

熱門標簽:地圖標注原件 淮安自動外呼系統開發 宜賓外呼系統廠家 廣州市400電話辦理 南通防封外呼系統運營商 語音電話機器人缺點 百變地圖標注 修改高德地圖標注 語音電話機器人營銷方案
1 引言
在關系數據庫(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢復和交易單位為一個事務(Transactions),事務具有ACID(原子性,一致性,隔離性和永久性)特征。關系數據庫為了確保并發用戶在存取同一數據庫對象時的正確性(即無丟失更新、可重復讀、不讀"臟"數據,無"幻像"讀),數據庫中引入了并發(鎖)機制。基本的鎖類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。
排它鎖:若事務T對數據D加X鎖,則其它任何事務都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數據前要向該數據加排它鎖,所以排它鎖又稱為寫鎖。
共享鎖:若事務T對數據D加S鎖,則其它事務只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數據前要向該數據加共享鎖,所以共享鎖又稱為讀鎖。
2 DB2 多粒度封鎖機制介紹
2.1 鎖的對象
DB2支持對表空間、表、行和索引加鎖(大型機上的數據庫還可以支持對數據頁加鎖)來保證數據庫的并發完整性。不過在考慮用戶應用程序的并發性的問題上,通常并不檢查用于表空間和索引的鎖。該類問題分析的焦點在于表鎖和行鎖。
2.2 鎖的策略
DB2可以只對表進行加鎖,也可以對表和表中的行進行加鎖。如果只對表進行加鎖,則表中所有的行都受到同等程度的影響。如果加鎖的范圍針對于表及下屬的行,則在對表加鎖后,相應的數據行上還要加鎖。究竟應用程序是對表加行鎖還是同時加表鎖和行鎖,是由應用程序執行的命令和系統的隔離級別確定。
2.2.1 DB2表鎖的模式
DB2在表一級加鎖可以使用以下加鎖方式:

表一:DB2數據庫表鎖的模式

下面對幾種表鎖的模式進一步加以闡述:
IS、IX、SIX方式用于表一級并需要行鎖配合,他們可以阻止其他應用程序對該表加上排它鎖。
•        如果一個應用程序獲得某表的IS鎖,該應用程序可獲得某一行上的S鎖,用于只讀操作,同時其他應用程序也可以讀取該行,或是對表中的其他行進行更改。 
•        如果一個應用程序獲得某表的IX鎖,該應用程序可獲得某一行上的X鎖,用于更改操作,同時其他應用程序可以讀取或更改表中的其他行。 
•        如果一個應用程序獲得某表的SIX鎖,該應用程序可以獲得某一行上的X鎖,用于更改操作,同時其他應用程序只能對表中其他行進行只讀操作。 
S、U、X和Z方式用于表一級,但并不需要行鎖配合,是比較嚴格的表加鎖策略。
•        如果一個應用程序得到某表的S鎖。該應用程序可以讀表中的任何數據。同時它允許其他應用程序獲得該表上的只讀請求鎖。如果有應用程序需要更改讀該表上的數據,必須等S鎖被釋放。 
•        如果一個應用程序得到某表的U鎖,該應用程序可以讀表中的任何數據,并最終可以通過獲得表上的X鎖來得到對表中任何數據的修改權。其他應用程序只能讀取該表中的數據。U鎖與S鎖的區別主要在于更改的意圖上。U鎖的設計主要是為了避免兩個應用程序在擁有S鎖的情況下同時申請X鎖而造成死鎖的。 
•        如果一個應用程序得到某表上的X鎖,該應用程序可以讀或修改表中的任何數據。其他應用程序不能對該表進行讀或者更改操作。 
•        如果一個應用程序得到某表上的Z鎖,該應用程序可以讀或修改表中的任何數據。其他應用程序,包括未提交讀程序都不能對該表進行讀或者更改操作。 
IN鎖用于表上以允許未提交讀這一概念。
2.2.2 DB2行鎖的模式
除了表鎖之外,DB2還支持以下幾種方式的行鎖。

表二:DB2數據庫行鎖的模式

2.2.3 DB2鎖的兼容性

表三:DB2數據庫表鎖的相容矩陣


表四:DB2數據庫行鎖的相容矩陣

下表是筆者總結了DB2中各SQL語句產生表鎖的情況(假設缺省的隔離級別為CS):


2.3 DB2鎖的升級
每個鎖在內存中都需要一定的內存空間,為了減少鎖需要的內存開銷,DB2提供了鎖升級的功能。鎖升級是通過對表加上非意圖性的表鎖,同時釋放行鎖來減少鎖的數目,從而達到減少鎖需要的內存開銷的目的。鎖升級是由數據庫管理器自動完成的,有兩個數據庫的配置參數直接影響鎖升級的處理:
locklist--在一個數據庫全局內存中用于鎖存儲的內存。單位為頁(4K)。
maxlocks--一個應用程序允許得到的鎖占用的內存所占locklist大小的百分比。
鎖升級會在這兩種情況下被觸發:
•        某個應用程序請求的鎖所占用的內存空間超出了maxlocks與locklist的乘積大小。這時,數據庫管理器將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。 
•        在一個數據庫中已被加上的全部鎖所占的內存空間超出了locklist定義的大小。這時,數據庫管理器也將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。 
•        鎖升級雖然會降低OLTP應用程序的并發性能,但是鎖升級后會釋放鎖占有內存并增大可用的鎖的內存空間。 
鎖升級是有可能會失敗的,比如,現在一個應用程序已經在一個表上加有IX鎖,表中的某些行上加有X鎖,另一個應用程序又來請求表上的IS鎖,以及很多行上的S鎖,由于申請的鎖數目過多引起鎖的升級。數據庫管理器試圖為該應用程序申請表上的S鎖來減少所需要的鎖的數目,但S鎖與表上原有的IX鎖沖突,鎖升級不能成功。
如果鎖升級失敗,引起鎖升級的應用程序將接到一個-912的SQLCODE。在鎖升級失敗后,DBA應該考慮增加locklist的大小或者增大maxlocks的百分比。同時對編程人員來說可以在程序里對發生鎖升級后程序回滾后重新提交事務(例如:if sqlca.sqlcode=-912 then rollback and retry等)。
3 Oracle 多粒度鎖機制介紹
根據保護對象的不同,Oracle數據庫鎖可以分為以下幾大類:
(1) DML lock(data locks,數據鎖):用于保護數據的完整性;
(2) DDL lock(dictionary locks,字典鎖):用于保護數據庫對象的結構(例如表、視圖、索引的結構定義);
(3) Internal locks 和latches(內部鎖與閂):保護內部數據庫結構;
(4) Distributed locks(分布式鎖):用于OPS(并行服務器)中;
(5) PCM locks(并行高速緩存管理鎖):用于OPS(并行服務器)中。
在Oracle中最主要的鎖是DML(也可稱為data locks,數據鎖)鎖。從封鎖粒度(封鎖對象的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。
3.1 Oracle的TX鎖(行級鎖、事務鎖)
許多對Oracle不太了解的技術人員可能會以為每一個TX鎖代表一條被封鎖的數據行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應多個被該事務鎖定的數據行(在我們用的時候多是啟動一個事務,然后SELECT… FOR UPDATE NOWAIT)。
在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定。Oracle不像DB2那樣,建立一個鏈表來維護每一行被加鎖的數據,這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了類似DB2使用行級鎖時經常發生的鎖數量不夠而進行鎖升級的情況。數據行上的鎖標志一旦被置位,就表明該行數據被加X鎖,Oracle在數據行上沒有S鎖。
3.2 TM鎖(表級鎖)
3.2.1 意向鎖的引出
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那么該鎖的申請也應被阻塞。如果表中的數據很多,逐行檢查鎖標志的開銷將很大,系統的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了"意向鎖"的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然后再對該行加鎖。這樣一來,事務對表加鎖時,就不再需要檢查表中每行記錄的鎖標志位了,系統效率得以大大提高。
3.2.2 意向鎖的類型
由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個數據庫對象加S鎖,首先要對其上級結點加IS鎖,表示它的后裔結點擬(意向)加S鎖;
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個數據庫對象加X鎖,首先要對其上級結點加IX鎖,表示它的后裔結點擬(意向)加X鎖。
另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還可以組合出新的鎖類型,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的"="指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。
這樣我們又可以引入一種新的鎖的類型:
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖):如果對一個數據庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。
這樣數據庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。
具有意向鎖的多粒度封鎖方法中任意事務T要對一個數據庫對象加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的并發度,減少了加鎖和解鎖的開銷。
3.3 Oracle的TM鎖(表級鎖)
Oracle的DML鎖(數據鎖)正是采用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)類型共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。需要注意的是,由于Oracle在行級只提供X鎖,所以與RS鎖(通過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行數據實際上還沒有被修改),這與理論上的IS鎖是有區別的。鎖的兼容性是指當一個應用程序在表(行)上加上某種鎖后,其他應用程序是否能夠在表(行)上加上相應的鎖,如果能夠加上,說明這兩種鎖是兼容的,否則說明這兩種鎖不兼容,不能對同一數據對象并發存取。
下表為Oracle數據庫TM鎖的兼容矩陣(Y=Yes,表示兼容的請求; N=No,表示不兼容的請求;-表示沒有加鎖請求):

表五:Oracle數據庫TM鎖的相容矩陣

一方面,當Oracle執行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時,系統自動在所要操作的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當表級鎖獲得后,系統再自動申請TX鎖,并將實際鎖定的數據行的鎖標志位置位(指向該TX鎖);另一方面,程序或操作人員也可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。下表是筆者總結了Oracle中各SQL語句產生TM鎖的情況:

表六:Oracle數據庫TM鎖小結

我們可以看到,通常的DML操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;另外,Oracle數據庫的一個顯著特點是,在缺省情況下,單純地讀數據(SELECT)并不加鎖,Oracle通過回滾段(Rollback segment)來保證用戶不讀"臟"數據。這些都提高了系統的并發程度。
由于意向鎖及數據行上鎖標志位的引入,減小了Oracle維護行級鎖的開銷,這些技術的應用使Oracle能夠高效地處理高度并發的事務請求。
4 DB2多粒度封鎖機制的監控
在DB2中對鎖進行監控主要有兩種方式,第一種方式是快照監控,第二種是事件監控方式。
4.1 快照監控方式
當使用快照方式進行鎖的監控前,必須把監控鎖的開關打開,可以從實例級別和會話級別打開,具體命令如下:

db2 update dbm cfg using dft_mon_lock on(實例級別)
db2 update monitor switches using lock on(會話級別,推薦使用)
當開關打開后,可以執行下列命令來進行鎖的監控
db2 get snapshot for locks on ebankdb(可以得到當前數據庫中具體鎖的詳細信息)
db2 get snapshot for locks on ebankdb
Fri Aug 15 15:26:00 JiNan 2004(紅色為鎖的關鍵信息)


             Database Lock Snapshot
Database name                              = DEV
Database path                              = /db2/DEV/db2dev/NODE0000/SQL00001/
Input database alias                       = DEV
Locks held                                 = 49
Applications currently connected           = 38
Agents currently waiting on locks          = 6
Snapshot timestamp                         = 08-15-2003 15:26:00.951134
Application handle                         = 6
Application ID                             = *LOCAL.db2dev.030815021007
Sequence number                            = 0001
Application name                           = disp+work
Authorization ID                           = SAPR3
Application status                         = UOW Waiting
Status change time                         =
Application code page                      = 819
Locks held                                 = 0
Total wait time (ms)                       = 0
Application handle                         = 97
Application ID                             = *LOCAL.db2dev.030815060819
Sequence number                            = 0001
Application name                           = tp
Authorization ID                           = SAPR3
Application status                         = Lock-wait
Status change time                         = 08-15-2003 15:08:20.302352
Application code page                      = 819
Locks held                                 = 6
Total wait time (ms)                       = 1060648
  Subsection waiting for lock              = 0
  ID of agent holding lock                 = 100
  Application ID holding lock              = *LOCAL.db2dev.030815061638
  Node lock wait occurred on               = 0
  Lock object type                         = Row
  Lock mode                                = Exclusive Lock (X)
  Lock mode requested                      = Exclusive Lock (X)
  Name of tablespace holding lock          = PSAPBTABD
  Schema of table holding lock             = SAPR3
  Name of table holding lock               = TPLOGNAMES
  Lock wait start timestamp                = 08-15-2003 15:08:20.302356
  Lock is a result of escalation           = NO
List Of Locks
  Lock Object Name            = 29204
Node number lock is held at = 0
Object Type                 = Table
Tablespace Name             = PSAPBTABD
Table Schema                = SAPR3
Table Name                  = TPLOGNAMES
Mode                        = IX
Status                      = Granted
Lock Escalation             = NO 


db2 get snapshot for database on dbname |grep -i locks(UNIX,LINUX平臺)


Locks held currently                       = 7
Lock waits                                 = 75
Time database waited on locks (ms)         = 82302438
Lock list memory in use (Bytes)            = 20016
Deadlocks detected                         = 0
Lock escalations                           = 8
Exclusive lock escalations                 = 8
Agents currently waiting on locks          = 0
Lock Timeouts                              = 20

db2 get snapshot for database on dbname |find /i "locks"(NT平臺)
db2 get snapshot for locks for applications agentid 45(注:45為應用程序句柄)


Application handle                         = 45
Application ID                             = *LOCAL.db2dev.030815021827
Sequence number                            = 0001
Application name                           = tp
Authorization ID                           = SAPR3
Application status                         = UOW Waiting
Status change time                         =
Application code page                      = 819
Locks held                                 = 7
Total wait time (ms)                       = 0
List Of Locks
Lock Object Name            = 1130185838
Node number lock is held at = 0
Object Type                 = Key Value
Tablespace Name             = PSAPBTABD
Table Schema                = SAPR3
Table Name                  = TPLOGNAMES
Mode                        = X
Status                      = Granted
Lock Escalation             = NO
Lock Object Name            = 14053937
Node number lock is held at = 0
Object Type                 = Row
Tablespace Name             = PSAPBTABD
Table Schema                = SAPR3
Table Name                  = TPLOGNAMES
Mode                        = X
Status                      = Granted
Lock Escalation             = NO


也可以執行下列表函數(注:在DB2 V8之前只能通過命令,DB2 V8后可以通過表函數,推薦使用表函數來進行鎖的監控)
db2 select * from table(snapshot_lock('DBNAME',-1)) as locktable監控鎖信息
db2 select * from table(snapshot_lockwait('DBNAME',-1) as lock_wait_table監控應用程序鎖等待的信息
4.2 事件監控方式:
當使用事件監控器進行鎖的監控時候,只能監控死鎖(死鎖的產生是因為由于鎖請求沖突而不能結束事務,并且該請求沖突不能夠在本事務內解決。通常是兩個應用程序互相持有對方所需要的鎖,在得不到自己所需要的鎖的情況下,也不會釋放現有的鎖)的情況,具體步驟如下:
db2 create event monitor dlock for deadlocks with details write to file '$HOME/dir'
db2 set event monitor dlock state 1
db2evmon -db dbname -evm dlock看具體的死鎖輸出(如下圖)


      Deadlocked Connection ...
  Deadlock ID:   4
  Participant no.: 1
  Participant no. holding the lock: 2
  Appl Id: G9B58B1E.D4EA.08D387230817
  Appl Seq number: 0336
  Appl Id of connection holding the lock: G9B58B1E.D573.079237231003
  Seq. no. of connection holding the lock: 0126
  Lock wait start time: 06/08/2005 08:10:34.219490
  Lock Name       : 0x000201350000030E0000000052
  Lock Attributes : 0x00000000
  Release Flags   : 0x40000000
  Lock Count      : 1
  Hold Count      : 0
  Current Mode    : NS  - Share (and Next Key Share)
  Deadlock detection time: 06/08/2005 08:10:39.828792
  Table of lock waited on      : ORDERS
  Schema of lock waited on     : DB2INST1
  Tablespace of lock waited on : USERSPACE1
  Type of lock: Row
  Mode of lock: NS  - Share (and Next Key Share)
  Mode application requested on lock: X   - Exclusive
  Node lock occured on: 0
  Lock object name: 782
  Application Handle: 298
  Deadlocked Statement:
    Type     : Dynamic
    Operation: Execute
    Section  : 34
    Creator  : NULLID
    Package  : SYSSN300
    Cursor   : SQL_CURSN300C34
    Cursor was blocking: FALSE
    Text     : UPDATE ORDERS  SET TOTALTAX = ?, TOTALSHIPPING = ?, 
        LOCKED = ?, TOTALTAXSHIPPING = ?, STATUS = ?, FIELD2 = ?, TIMEPLACED = ?, 
        FIELD3 = ?, CURRENCY = ?, SEQUENCE = ?, TOTALADJUSTMENT = ?, ORMORDER = ?, 
        SHIPASCOMPLETE = ?, PROVIDERORDERNUM = ?, TOTALPRODUCT = ?, DESCRIPTION = ?, 
        MEMBER_ID = ?, ORGENTITY_ID = ?, FIELD1 = ?, STOREENT_ID = ?, ORDCHNLTYP_ID = ?, 
        ADDRESS_ID = ?, LASTUPDATE = ?, COMMENTS = ?, NOTIFICATIONID = ? WHERE ORDERS_ID = ?
  List of Locks:
      Lock Name                   : 0x000201350000030E0000000052
      Lock Attributes             : 0x00000000
      Release Flags               : 0x40000000
      Lock Count                  : 2
      Hold Count                  : 0
      Lock Object Name            : 782
      Object Type                 : Row
      Tablespace Name             : USERSPACE1
      Table Schema                : DB2INST1
      Table Name                  : ORDERS
      Mode                        : X   - Exclusive
      Lock Name                   : 0x00020040000029B30000000052
      Lock Attributes             : 0x00000020
      Release Flags               : 0x40000000
      Lock Count                  : 1
      Hold Count                  : 0
      Lock Object Name            : 10675
      Object Type                 : Row
      Tablespace Name             : USERSPACE1
      Table Schema                : DB2INST1
      Table Name                  : BKORDITEM
      Mode                        : X   - Exclusive(略去后面信息)

5 Oracle 多粒度封鎖機制的監控
為了監控Oracle系統中鎖的狀況,我們需要對幾個系統視圖有所了解:
5.1 v$lock視圖
v$lock視圖列出當前系統持有的或正在申請的所有鎖的情況,其主要字段說明如下:

表七:v$lock視圖主要字段說明

其中在TYPE字段的取值中,本文只關心TM、TX兩種DML鎖類型;
5.2 v$locked_object視圖
v$locked_object視圖列出當前系統中哪些對象正被鎖定,其主要字段說明如下:

表八:v$locked_object視圖字段說明

5.3 Oracle鎖監控腳本
根據上述系統視圖,可以編制腳本來監控數據庫中鎖的狀況。
5.3.1 showlock.sql
第一個腳本showlock.sql,該腳本通過連接v$locked_object與all_objects兩視圖,顯示哪些對象被哪些會話鎖住:


/* showlock.sql */
column o_name format a10
column lock_type format a20
column object_name format a15
select rpad(oracle_username,10) o_name,session_id sid,
decode(locked_mode,0,'None',1,'Null',2,'Row share',
3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_type,
object_name ,xidusn,xidslot,xidsqn
from v$locked_object,all_objects
where v$locked_object.object_id=all_objects.object_id;
5.3.2        showalllock.sql

第二個腳本showalllock.sql,該腳本主要顯示當前所有TM、TX鎖的信息;


/* showalllock.sql */
select sid,type,id1,id2,
decode(lmode,0,'None',1,'Null',2,'Row share',
3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive')
lock_type,request,ctime,block
from v$lock
where TYPE IN('TX','TM');
6 DB2 多粒度封鎖機制示例
以下示例均運行在DB2 UDB中,適用所有數據庫版本。首先打開三個命令行窗口(DB2 CLP),其中兩個(以下用SESS#1、SESS#2表示)以db2admin用戶連入數據庫,以操作SAMPLE庫中提供的示例表(employee);另一個(以下用SESS#3表示)以db2admin用戶連入數據庫,對執行的每一種類型的SQL語句監控加鎖的情況;希望讀者通過這種方式對每一種類型的SQL語句監控加鎖的情況。(因為示例篇幅很大,筆者在此就不做了,建議讀者用類似方法驗證加鎖情況)


/home/db2inst1>db2 +c update employee set comm=9999(SESS#1)
/home/db2inst1>db2 +c select * from employee(SESS#2處于lock wait)
/home/db2inst1>db2 +c get snapshot for locks on sample(SESS#3監控加鎖情況)

注:db2 +c為不自動提交(commit)SQL語句,也可以通過 db2 update command options using c off關閉自動提交(autocommit,缺省是自動提交)
7 總結
總的來說,DB2的鎖和Oracle的鎖主要有以下大的區別:
1.Oracle通過具有意向鎖的多粒度封鎖機制進行并發控制,保證數據的一致性。其DML鎖(數據鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;DB2也是通過具有意向鎖的多粒度封鎖機制進行并發控制,保證數據的一致性。其DML鎖(數據鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(IS,SIX或IX),其真正的封鎖粒度也是在行級;另外,在Oracle數據庫中,單純地讀數據(SELECT)并不加鎖,這些都提高了系統的并發程度,Oracle強調的是能夠"讀"到數據,并且能夠快速的進行數據讀取。而DB2的鎖強調的是"讀一致性",進行讀數據(SELECT)時會根據不同的隔離級別(RR,RS,CS)而分別加S,IS,IS鎖,只有在使用UR隔離級別時才不加鎖。從而保證不同應用程序和用戶讀取的數據是一致的。
2. 在支持高并發度的同時,DB2和Oracle對鎖的操縱機制有所不同:Oracle利用意向鎖及數據行上加鎖標志位等設計技巧,減小了Oracle維護行級鎖的開銷,使其在數據庫并發控制方面有著一定的優勢。而DB2中對每個鎖會在鎖的內存(locklist)中申請分配一定字節的內存空間,具體是X鎖64字節內存,S鎖32字節內存(注:DB2 V8之前是X鎖72字節內存而S鎖36字節內存)。
3. Oracle數據庫中不存在鎖升級,而DB2數據庫中當數據庫表中行級鎖的使用超過locklist*maxlocks會發生鎖升級。
4. 在Oracle中當一個session對表進行insert,update,delete時候,另外一個session仍然可以從Orace回滾段或者還原表空間中讀取該表的前映象(before image); 而在DB2中當一個session對表進行insert,update,delete時候,另外一個session仍然在讀取該表數據時候會處于lock wait狀態,除非使用UR隔離級別可以讀取第一個session的未提交的值;所以Oracle同一時刻不同的session有讀不一致的現象,而DB2在同一時刻所有的session都是"讀一致"的。
8 結束語
DB2中關于并發控制(鎖)的建議
1.正確調整locklist,maxlocks,dlchktime和locktimeout等和鎖有關的數據庫配置參數(locktimeout最好不要等于-1)。如果鎖內存不足會報SQL0912錯誤而影響并發。
2.寫出高效而簡潔的SQL語句(非常重要)。
3.在業務邏輯處理完后盡可能快速commit釋放鎖。
4.對引起鎖等待(SQL0911返回碼68)和死鎖(SQL0911返回碼2)的SQL語句創建最合理的索引(非常重要,盡量創建復合索引和包含索引)。
5.使用 altER TABLE 語句的 LOCKSIZE 參數控制如何在持久基礎上對某個特定表進行鎖定。檢查syscat.tables中locksize字段,盡量在符合業務邏輯的情況下,每個表中該字段為"R"(行級鎖)。
6.根據業務邏輯使用正確的隔離級別(RR,RS,CS和UR)。
7.當執行大量更新時,更新之前,在整個事務期間鎖定整個表(使用 SQL LOCK TABLE 語句)。這只使用了一把鎖從而防止其它事務進行這些更新,但是對于其他用戶它的確減少了數據并發性。

標簽:聊城 通化 嘉峪關 襄陽 股票投資 南平 南平 池州

巨人網絡通訊聲明:本文標題《DB2和 Oracle的并發控制(鎖)的比較》,本文關鍵詞  DB2,和,Oracle,的,并發,控制,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《DB2和 Oracle的并發控制(鎖)的比較》相關的同類信息!
  • 本頁收集關于DB2和 Oracle的并發控制(鎖)的比較的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日韩欧美成人激情| 精品福利视频一区二区三区| 国产欧美一区二区在线观看| 日本美女一区二区三区| 亚洲成a人片在线www| 色婷婷激情久久| 国产精品美女久久久久aⅴ| 国内精品国产成人国产三级粉色| 久久无码人妻精品一区二区三区 | 精品久久国产字幕高潮| 午夜视频在线观看一区二区三区| 99麻豆久久久国产精品免费优播| 希岛爱理中文字幕| 国产亚洲欧美日韩日本| 精品一区二区三区在线播放视频| asian性开放少妇pics| 日韩美女视频在线| 免费成人在线视频观看| 素人fc2av清纯18岁| 日韩精品一区二区在线观看| 欧美aaaaaa午夜精品| 伊人网伊人影院| 精品久久国产字幕高潮| 久久精品国产一区二区三区免费看| 久久久久亚洲av无码专区桃色| 日韩视频免费直播| 美女在线视频一区| 中文字幕第24页| 国产日韩欧美综合在线| 国产精华液一区二区三区| 久久国产高清视频| 综合av第一页| 91av免费观看| 欧美一区中文字幕| 美女一区二区视频| 潮喷失禁大喷水aⅴ无码| 欧美国产日韩在线观看| 不卡免费追剧大全电视剧网站| 精品一区二区免费在线观看| 免费一级特黄3大片视频| 中文字幕精品三区| 性色av浪潮av| 欧美一卡2卡三卡4卡5免费| 韩国v欧美v亚洲v日本v| 国产探花在线视频| 亚洲欧美偷拍卡通变态| 在线播放av网址| 日韩精品在线一区| 国产精品66部| 欧美在线不卡一区| 日本三级亚洲精品| 久久精品在线观看视频| 亚洲精品视频在线观看免费| 亚洲av永久无码精品| 精品国产sm最大网站免费看| 成人av电影免费在线播放| 欧美日韩高清一区二区三区| 久久国产人妖系列| 一本久久a久久精品亚洲| 亚洲成人福利片| 性高潮久久久久久久| 国产精品久久久久9999吃药| 欧美午夜精品一区二区| 欧美精品一区二区久久久| 不卡电影一区二区三区| 欧美一级片在线| 成人激情电影免费在线观看| 在线播放一区二区三区| 国产精品亚洲成人| 欧美日韩国产免费一区二区| 国内不卡的二区三区中文字幕| 在线观看一区二区视频| 麻豆视频一区二区| 欧美在线免费视屏| 久久不见久久见中文字幕免费| 一本久久综合亚洲鲁鲁五月天| 石原莉奈一区二区三区在线观看| 久草福利资源在线| 石原莉奈一区二区三区在线观看| 东方av正在进入| 蜜芽一区二区三区| 色婷婷av一区二区三区之一色屋| 免费久久精品视频| 日本道色综合久久| 国产一区免费电影| 91精品一区二区三区在线观看| 国产91精品欧美| 日韩免费观看高清完整版在线观看| gogo大胆日本视频一区| 欧美精品一区二区三区蜜臀| 国产成人av免费观看| 日本一区二区电影| 成人h动漫精品一区| 91.com视频| proumb性欧美在线观看| 久久久久亚洲av成人无码电影 | 91影院在线观看| 黑人无套内谢中国美女| 国产视频一区二区在线观看| 挪威xxxx性hd极品| 国产精品成人网| 国产91丝袜美女在线播放| 日韩高清一级片| 欧美在线三级电影| 波多野结衣在线一区| 久久综合色8888| 亚洲天堂资源在线| 亚洲国产日韩精品| 色琪琪一区二区三区亚洲区| 国产精品一区不卡| 欧美大片一区二区| aaaaaav| 亚洲综合自拍偷拍| 91黄色免费观看| 东方aⅴ免费观看久久av| 久久日一线二线三线suv| 狠狠人妻久久久久久综合蜜桃| 一区二区高清在线| 色悠悠亚洲一区二区| 成人免费高清视频| 欧美国产日产图区| 少妇太紧太爽又黄又硬又爽小说 | 亚洲一区在线观看免费观看电影高清| 成年人二级毛片| 国产成人精品一区二区三区网站观看| 精品久久国产字幕高潮| 女~淫辱の触手3d动漫| 秋霞国产午夜精品免费视频 | www.亚洲精品| 国产精品久久久久久妇女6080| 99热6这里只有精品| 欧美精品一区二区三| 国产一区二区毛片| 337p粉嫩大胆噜噜噜噜噜91av| 在线免费播放av| 肉色丝袜一区二区| 欧美一级高清大全免费观看| 亚洲精品女人久久久| 日韩av电影免费观看高清完整版| 欧美一级在线视频| 国产精品九九九九九| 久久精品国产99国产| 久久婷婷国产综合国色天香| 国产精品情侣呻吟对白视频| 国产很黄免费观看久久| 国产精品萝li| 日本久久一区二区| 色哟哟网站在线观看| 午夜伦理一区二区| 日韩女同互慰一区二区| 免费看91的网站| 国产精品18久久久久久vr| 国产精品久久久久三级| 色吧成人激情小说| 波多野结衣一二三区| 日韩电影在线看| 久久久亚洲精品石原莉奈 | 日韩欧美国产系列| 夜夜春很很躁夜夜躁| 国产剧情一区二区| 亚洲欧美另类在线| 在线电影院国产精品| 美女被到爽高潮视频| 国产成人亚洲综合a∨婷婷图片| 国产精品久久久久久亚洲伦| 欧美性生活一区| 精品无码在线视频| 国产精品资源网| 亚洲日本一区二区| 欧美一区二区在线播放| 国产伦精品一区二区三区视频女| 国产成人精品午夜视频免费| 亚洲激情五月婷婷| 欧美大胆一级视频| 日本a级片视频| 中文在线永久免费观看| 国产精品一区二区果冻传媒| 亚洲黄色小说网站| 欧美tickling网站挠脚心| 黑鬼狂亚洲人videos| 岛国av免费观看| 国产一区二区看久久| 亚洲精品va在线观看| 欧美成人三级在线| 波多野结衣爱爱视频| 亚洲永久无码7777kkk| 国产91丝袜在线播放| 日韩国产精品久久久| 国产精品麻豆一区二区| 在线综合亚洲欧美在线视频 | 日本午夜精品一区二区三区电影| 国产视频一区二区三区在线观看| 欧美性一二三区| 在线观看天堂av| 亚洲性图第一页| 国产精品亚洲成人| 日韩精品成人一区二区在线| 综合久久给合久久狠狠狠97色| 日韩欧美综合在线| 一本久久a久久精品亚洲|