當前位置:首頁 » 數據倉庫 » db2資料庫表上鎖了
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

db2資料庫表上鎖了

發布時間: 2023-05-06 21:43:50

1. 用sql如何給DB2表加鎖和解鎖

在DB2的命令行中輸入:
update monitor switches using lock on table on
然後打開另一個DB2命令窗口執行我的那個被弔死的Update語句。
然後在第一個DB2命令窗口執行: [@more@]get snapshot for locks on Database_Name(你的資料庫的名字)> locks.TXT

然後,可以看到第一個DB2的窗口有一個信息輸出,把這些信息輸出到TXT中,大致如下:

應用程序句柄 = 36
應用程序標識 = AC100C47.IC05.00F6C6095828
序號 = 0246
應用程序名 = java.exe
CONNECT 授權標識 = DB2ADMIN
應用程序狀態 = UOW 正在等待
狀態更改時間 = 未收集
應用程序代碼頁 = 1208
掛起的鎖定 = 0
總計等待時間(毫秒) = 0

應用程序句柄 = 43
應用程序標識 = *LOCAL.DB2.060512054331
序號 = 2273
應用程序名 = java.exe
CONNECT 授權標識 = DB2ADMIN
應用程序狀態 = 聯合請求暫掛
狀態更改時間 = 未收集
應用程序代碼頁 = 1208
掛起的鎖定 = 6
總計等待時間(毫秒) = 0

鎖定列表
鎖定名稱 = 0x031F9052000000000000000055
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 255
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部
方式 = S

鎖定名稱 = 0x26800000000000000000000044
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部
方式 = S

鎖定名稱 = 0x020006000F1700000000000052
鎖定屬性 = 0x00000000
發行版標志 = 0x00000001
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 5903
對象類型 = 行
表空間名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS

鎖定名稱 = 0x01000000010000000500BC0056
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部變化鎖定
方式 = S

鎖定名稱 = 0x535953534E333030FD965C0641
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部方案鎖定
方式 = S

鎖定名稱 = 0x02000600000000000000000054
鎖定屬性 = 0x00000000
發行版標志 = 0x00000001
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 6
對象類型 = 表
表空間名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS

應用程序句柄 = 557
應用程序標識 = *LOCAL.DB2.060512053913
序號 = 1254
應用程序名 = java.exe
CONNECT 授權標識 = DB2ADMIN
應用程序狀態 = 聯合請求暫掛
狀態更改時間 = 未收集
應用程序代碼頁 = 1208
掛起的鎖定 = 6
總計等待時間(毫秒) = 0

鎖定列表
鎖定名稱 = 0x031F9052000000000000000055
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 255
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部
方式 = S

鎖定名稱 = 0x26800000000000000000000044
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部
方式 = S

鎖定名稱 = 0x02000600071D00000000000052
鎖定屬性 = 0x00000000
發行版標志 = 0x00000001
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 7431
對象類型 = 行
表空間名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS

鎖定名稱 = 0x01000000010000000500BC0056
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部變化鎖定
方式 = S

鎖定名稱 = 0x535953534E333030FD965C0641
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 0
對象類型 = 內部方案鎖定
方式 = S

鎖定名稱 = 0x02000600000000000000000054
鎖定屬性 = 0x00000000
發行版標志 = 0x00000001
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 6
對象類型 = 表
表空間名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS

其中應用程序句柄43和557的狀態都是死鎖了,猜測是這2個應用爭用DB2的表,造成死鎖,根據日誌提示,在DB2的命令窗口輸入:
force application (43)
force application (557)
提示這個操作是非同步的,我執行list applicaions,結果進程中還有那2個進程,那2個進程可能是在執行比較大的操作,需要耐心等待,如何還不行,則使用下面的命令來強制所有的應用都停止,然後重啟DB2:
force application all
terminate
db2stop force
db2start
如果DB2在Window上,則可以使用「控制中心」->實例->右鍵「應用程序」,可以看到當前的鎖定情況,並且可以強行關閉某個進程,也可以顯示「鎖定鏈」。

2. db2 導入數據之後,有幾張表被鎖住,提示是表不活動,不能被訪問,請問是什麼原因

請問你是用LOAD還是IMPORT導入數據,如果用LOAD就可能存在這種情況。

LOAD鎖表大概有兩種情況,
一是你的資料庫日誌為歸檔日誌,但是在使用LOAD的時候沒有指定LOAD之後數據不可恢復,導致你的表空間被鎖定,處於Backup pendding 狀態,這種情況資料庫會要求你做資料庫備份或者表空間備份。
二是數據裝載時有主外鍵的表違反了主外鍵約束,表被鎖定,這種情況可以使用語句來解除表的鎖定
SET INTEGRITY FOR <table_schema>.<table_name> IMMEDIATE CHECKED

3. 資料庫死鎖,並發問題

補充樓主:
其實我沒什麼經驗,只不過是了解一些基礎的東西罷了。
一樓的 一朵瘩紅花 實際經驗很豐富,你可以向她咨詢一下。

你問的問題挺好得。三個概念緊密聯系在一起。
這樣說吧:並發的幾個事務同時發生,不加鎖控制的話數據就會亂套了,而加了鎖後,又是並發訪問會出現死鎖,所以就會出現避免死鎖的一些措施。
首先談並發:理論指的是在一段時間同時對某件事進行操作。 注意精度問題,修改資料庫是在一段時間內操作,不是在某個時刻,而日誌則會從 時刻 開始記錄你的操作。

造成死鎖的原因是為了防止 不同的用戶同時間(不是時刻)都對某個數據修改,造成訪問不一致的問題。
比如你讀了資料庫的一個數據然後把它修改了並存回去,是需要時間的(假如是student表中的有個grade屬性,你改了一條記錄的一個值)在這個過程當中,有人又訪問了資料庫並且恰恰訪問的是存回去之前的數據,然後他要進行操作,過了一段時間,此時你已經存回去了數據。會發現原來的數據被改動了。這時數據就亂套了。(專業術語叫讀臟數據,其實還有很多其他類似這種導致前後數據不一致的問題)所以為了限定這種操作,資料庫設計了-----鎖---來鎖定這種操作。就是你正在操作某個數據的時候----通常之前會先鎖定這個數據,這樣別人就不能對此數據操作了(嚴格來說就是只能讀,不能改),必須等你操作完才能對此數據修改等操作,這就在一定程度上避免了前後操作數據不一致的問題。

但是有了鎖後,新問題出現了,就是死鎖:

簡單解釋死鎖:進程A等待進程B釋放他的資源,B又等待A釋放他的資源,這樣就互相等待就形成死鎖

官方解釋死鎖
死鎖,根本原因在於對共享存儲區的訪問。在資料庫中也一樣,如果需要「修改」一條數據,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有一個事務能進行修改操作。鎖有多種實現方式,比如意向鎖,共享-排他鎖,鎖表,樹形協議,時間戳協議等等。鎖還有多種粒度,比如可以在表上加鎖,也可以在記錄上加鎖。

在並發控制中,鎖是非常重要的。
至於在Oracle還是別的資料庫管理系統中,死鎖產生的原因沒有不同,不同的頂多是鎖的實現或者死鎖的恢復等罷了

再來說說事務:
事務簡單來說就是 一系列的對資料庫的操作揉在一起,要麼同時完成,要麼就都不完成。
比如---你要取錢的過程就可以當成是一個小的事務: 插卡,輸入取錢金額,取走錢,拿出來卡。此過程缺一不可。把所有這些過程細節封裝起來就成為一個事務。
以oracle資料庫為例:
一個事務(你可以認為是一系列業務的操作)起始於dml語句(insert、update、delete)
即一條dml語句就做為一個事務的起始,然後根據業務需要,進行其他的dml操作都算是事務的一部分。
最後碰到commit。或者rollback,或者其他意外什麼的都算作一個事務的結束。
整個過程就是一個事務。
事務的理論解釋就是那四個什麼特性:什麼原子性、一致性、隔離性和持久性
簡稱ACID

剩下的:資料庫是建立在操作系統之上的一個層次。
你問的是資料庫的存儲機制??工作機制??還是什麼的??
資料庫就是存數據的。資料庫管理系統是 對存的數據進行高效率的管理
大的結構分物理數據跟邏輯數據。
物理數據就是數據在存儲設備上的存儲方式,什麼物理聯系,物理結構,物理記錄等 術語。
邏輯數據就是程序員和用戶看到的數據形式。什麼邏輯聯系,邏輯結構==同上
資料庫管理類系統就是把這些邏輯跟物理相互轉換。 好比你輸入的叫邏輯數據存儲在磁碟上叫物理數據。等等。

廢話了一堆,也不知道回答對你的問題沒~~

4. db2 為什麼會鎖表

建議題主去看鎖機制,只要有數據有大量並發讀寫,都需要加鎖,否則影響事務一致性對生產系統是不能夠容忍的。

5. 如何查詢db2資料庫表是否被鎖

1、首先點擊桌面上的SQL server資料庫。

6. db2資料庫裡面的一張表被鎖定,怎麼解鎖

請教各位:DB2資料庫里如何判斷一個表被鎖
1、執行命令打開鎖的監視開光
UPDATE
MONITOR
SWITCHES
USING
lock
on==>;>;
2、查看資料庫的鎖的情況
get
snapshot
for
locks
on
tberp
3、某一個用戶的鎖的情況
get
snapshot
for
application
applid
C0A8084A.040A.031015144751
4、如果表被鎖可以關閉該應用連接
force
application
ID1
5、看正在運行的程序有沒有處於鎖等待狀態的
list
applications
for
db
tberp
show
detail

7. DB2資料庫發生死鎖了怎麼辦

db2 get snapshot for locks on sample
db2 get db cfg for sample
db2 update db cfg using dlchktime 10000
-查看資料庫管理器級別快照信息
db2 get snapshot for dbm
-查看資料庫級別快照信息
db2 get snapshot for database on dbname
-查看應用級別快照信息
db2 get snapshot for application agentid appl-handler
註:appl-handler可以從list applicaitions的輸出中得到
-查看錶級別快照信息
db2 get snapshot for tables on dbname
註:需要把tables快照開關設為ON才會有作用
-查看鎖快照信息
db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler
-查看動態sql語句快照信息
db2 get snapshot for dynamic sql on dbname

db2 get monitor switches
db2 update monitor switches using lock on statement on
create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'
set event monitor mymonitor state 1
db2evmon - path 'c:/temp'

--轉自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1頁:上線前的准備
第2頁:維護時的注意事項
第3頁:發生死鎖後的對策

【IT168 技術文檔】在新的資料庫應用系統上線初期,由於測試不完善或不熟悉DB2的機制,常會出現鎖等待死鎖等現象存在於我們的應用系統中,如何捕獲鎖等待或死鎖信息並解決鎖問題,是保證平穩上線必須面對的問題。目前應用系統最常使用的DB2資料庫版本有多個,有8.1,8.2,9.1還有新推出的9.5,對於不同版本的DB2資料庫提供的解決辦法不盡相同,下面對於上述問題的解決作了一個簡單說明,希望對大家有用。

首先在上線前有幾件跟鎖相關的事情需要開發設計人員一定要做好

1. 相關參數的更改

注冊表變數參數:

DB2_EVALUNCOMMITTED=on 當啟用此變數時,在可能的情況下,它將進行表或索引訪問掃描以延遲或避免行鎖定,直到知道數據記錄滿足謂詞求值為止。

DB2_SKIPDELETED=on 當啟用此變數時,在可能的情況下,它允許使用無條件地跳過已刪除的鍵或跳過已刪除的行。

DB2_SKIPINSERTED=on 當啟用此變數時,在可能的情況下,它允許跳過未落實的已插入行,就好像從未插入這些行一樣。

資料庫參數:

LOCKLIST 鎖定列表的內存量,當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。如果不是自動,需要設置相對大一些;DB2默認是行鎖,每個行鎖大約佔64或128個位元組(64位資料庫),計算鎖定列表內存的大小公式是: ( 每個應用程序的平均鎖定數目的估計值 * 每個鎖定所需的位元組數(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,這里只是建議公式,實際情況還要視操作系統實際的內存量來定。

MAXLOCKS 升級前鎖定列表的最大百分比,默認是22%(windows)或10%(unix),可以根據要求自行改動,計算公式是 2 * 100 / maxappls

DLCHKTIME 死鎖檢測時間間隔,默認是10000毫秒(10秒),可以根據要求自行改動,也可不動。增大此參數以降低檢查死鎖的頻率,因此增加應用程序必須等待消除死鎖的時間。 減小此參數會增大檢查死鎖的頻率,從而減少應用程序必須等待死鎖解決的時間,但是會增加資料庫管理器檢查死鎖所花的時間。

LOCKTIMEOUT 鎖等待時間,默認是 -1,也就是永遠等待,請改成固定的值,在事務處理(OLTP)環境中,可以使用 30 秒的初始啟動值。在一個只查詢的環境中,您可以從一個較高的值開始。

LOGFILSIZ 日誌文件大小,此參數定義每個主日誌文件和輔助日誌文件的大小。如果資料庫要運行大量更新、刪除或插入事務,而這將導致日誌文件很快變滿,則應增大日誌文件,了解您的並發應用程序的日誌記錄需求,來確定一個不會分配過量而浪費空間的日誌文件大小。

LOGPRIMARY 主日誌文件數,了解您的並發應用程序的日誌記錄需求,適當增大日誌文件數。

注意: 在更新參數時,需要注意有些參數在更改後需要重新啟動資料庫DB2實例才可以生效;有些參數需要斷開當前所有的應用程序,重新鏈接才能生效;有些參數可以立即生效,使用者請參考相關文檔,注意參數生效特性。

2. 應用程序設計

-程序盡量短小精悍

-程序盡量晚地訪問關鍵資源

-程序盡可能快地提交工作

-程序盡可能快地關閉游標

-建立合適索引

3. 性能測試

要根據將來實際的並發用戶數和數據量進行測試

上線之後維護時我們要做的幾件事情

1. 做好定期維護

通過使用如下命令進行維護:
-reorg表和索引定期重組
-runstats表和索引的統計信息定期更新
-rebind 程序包定期重新編譯

8. DB2資料庫發生死鎖了怎麼辦

資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在耐旦段於解決死鎖,通過SQL Server 2005, 現在似乎有了一種新的解決辦法。

將下面的SQL語句放在兩個不同的連接裡面,並且在5秒內同時執行,將會發生死鎖。

use Northwind
begin tran
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#
commit
print @#end tran@#

SQL Server對付死鎖的辦法是犧牲掉其中的一個,拋出異常,並且回滾事務。在SQL Server 2000,語句一旦發生異常,T-SQL將不會繼續運行,上面被犧牲的連接中, print @#end tran@#語句將不會被運行,所以我們很難在SQL Server 2000的T-SQL中對死鎖進行進一步的處理。

現在不同了,SQL Server 2005可以在T-SQL中對異常進行捕獲,這樣就給我們提供了一條處理死鎖的途徑:

下面利用的try ... catch來解決死鎖。

SET XACT_ABORT ON
declare @r int
set @r = 1
while @r <昌譽= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end

解決方法當然就是重試,但捕獲錯誤是前提。rollback後面的waitfor不可少,發生沖突後需要等待一段時間,@retry數目可以調整以應付不同的遲悄要求。

但是現在又面臨一個新的問題: 錯誤被掩蓋了,一但問題發生並且超過3次,異常卻不會被拋出。SQL Server 2005 有一個RaiseError語句,可以拋出異常,但卻不能直接拋出原來的異常,所以需要重新定義發生的錯誤,現在,解決方案變成了這樣:

declare @r int
set @r = 1
while @r <= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end
if ERROR_NUMBER() <> 0
begin
declare @ErrorMessage nvarchar(4000);
declare @ErrorSeverity int;
declare @ErrorState int;
select
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
raiserror (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
end

我希望將來SQL Server 2005能夠直接拋出原有異常,比如提供一個無參數的RaiseError。

因此方案有點臃腫,但將死鎖問題封裝到T-SQL中有助於明確職責,提高高層系統的清晰度。現在,對於DataAccess的代碼,或許再也不需要考慮死鎖問題了。

9. db2資料庫裡面的一張表被鎖定,怎麼解鎖

步驟一:使用命令get snapshot來查詢哪些進程鎖了哪些表。

步驟二:使用春渣命令force來斷開這些進行了死鎖的進程來。

步驟三: 使用命令list application查看是否已經斷開了哪些進行了死鎖的進程。