引起Oracle阻塞的原因
1、select for update
2、外鍵沒有創建索引
(1)主表上有頻繁的刪除操作
(2)主鍵上有頻繁的修改操作
(3)業務上經常會出現主表和從表進行關聯查詢
當第一個和第二個條件操作的時候,主表會在從表上創建一個鎖定,以保證主表主鍵的修改不會導致從表的數據在引用上不會出現問題。
如果經常對主表的主鍵進行修改都將導致從表被長時間鎖定。比如主表每次刪除1000條記錄,它將掃描從表1000次,以確定每一行記錄的改變
不會造成從表的引用不完整。因此,在從表的外鍵上應該創建索引。
oracle阻塞和鎖
1.沒有並發,就沒有鎖。
在數據庫中,並發的意思是超過兩個(含)以上的用戶對同樣的數據進行修改(包括插入、修改、刪除),並行的意思是將一件事情分成很多小的部分,讓每一部分同時執行,最后將執行結果進行匯總。並發和並行是不同的,沒有並發,就沒有鎖。這里主要介紹TM鎖和TX鎖。
其實,TM鎖更像是一個段級的鎖,通常我們叫它表鎖,是因為我們把這個表看成了一個段。當某個表中有幾個段的時候,可能一個段上有TM鎖,而另外的段中沒有TM鎖(可以進行DDL操作)。TX鎖實際上應該叫做事務鎖,它主要是為了維護是事務的一致性,從這個角度來看,TX鎖並非都是在對數據進行修改時才產生的,只要需要維護事務的一致性,就需要用到該鎖。例如分布式事務,一般來說就是通過dblink在幾個數據庫中處理數據,因為是分布式的操作方式,所以需要一個事務的總協調者,這時候即使都是讀取操作,依然需要一個TX鎖來維護事務的一致性。
Oracl中鎖的信息是數據庫的一個屬性,是物理的,並不是邏輯上屬於某個表或者某個行。在TX鎖中,id1和id2構成了事務在回滾段中的位置。它(id1和id2)的用處是,當其他操作需要讀取這個數據塊時,會發現這個數據塊上有活動的事務,因此需要到回滾段中去找該數據庫之前的內容,那么這些內容在回滾段的什么地方?這兩個值就告訴了你。對於TM鎖,id1就是加鎖的段對象,可以是一個表或者表上的一個分區,id2一般為0。
2.select for update (no wait)
3.外鍵和索引
如果系統中有主、外鍵引用關系,並且滿足以下情況之一,那么就應該考慮在外鍵字段中創建索引,以提高系統性能。
*主表上有頻繁的刪除操作
*主表上有頻繁的修改操作
*業務上經常對主表和從表進行關聯查詢