當前位置:首頁 » 編程語言 » db2查詢鎖表sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

db2查詢鎖表sql

發布時間: 2022-11-07 13:17:51

『壹』 DB2中如何使用sql語句進行表鎖

寫sql語句的時候 在後面加上一個 for update 你在去執行 增加 刪除的操作 這樣子表就會容易鎖住啦。

『貳』 db2 同一張表插入更新會鎖表嗎

會。分析DB2的鎖機制,由於DB2 默認是CS的隔離級別,它的原理是,游標每到一行就會鎖住改行,對於一般應用來說是足夠了,但是如果遇到全表掃描,那麼CS模式會鎖住表中大量的行,直到查詢完畢。
DB2的鎖注意事項:
Ø 優化查詢 Sql,建立合適的索引,使得其能夠走索引查詢,由於索引的范圍和排序,可以直接跳過許其他行,定位到符合我們需要的行。

Ø 採用合適的隔離級別。由於DB2 默認是CS的隔離級別,它的原理是,游標每到一行就會鎖住改行,對於一般應用來說是足夠了,但是如果遇到全表掃描,那麼CS模式會鎖住表中大量的行,直到查詢完畢。所以可以根據業務需求,將其改為UR模式,它不會對表加任何行鎖。或者在JDBC中設置隔離級別(Isolation Levels)

『叄』 DB2鎖方面的SQL語句分析

鎖表和mc_mer_trad_incom的更新頻率有關系的
可以在mc_payment_flow,mc_payment_flow表上建索引減少mc_mer_trad_incom的鎖表時間
如果有頻繁的mc_payment_flow,mc_payment_flow表的更新操作可以直接使用X鎖避免NS鎖的升級
可以在select中加入with rs use and keep exclusive locks避免鎖升級
資料庫的參數可調整locktimeout,locklist,maxlocks

『肆』 DB2如何解決並發鎖表問題

先定位一下是哪個程序句柄導致的死鎖。
方法一、查看db2diag.log文件
找到DeadLock or Lock timeout 死鎖或鎖超時信息
db2 force application(句柄ID)
直接結束進程即可。
方法二、DB2快照信息
1、看一下DB2快照信息
db2 get snapshot for locks on sample
可以得到類似信息:
資料庫鎖定快照
資料庫名稱 = SAMPLE
資料庫路徑 = D:\IBM\DB2\NODE0000\SQL00001\
輸入資料庫別名 = SAMPLE
掛起的鎖定 = 8
當前已連接的應用程序 = 2
當前正等待鎖定的代理程序數 = 1
應用程序句柄 = 54
應用程序標識 = *LOCAL.DB2.140304192925
序號 = 00001
應用程序名 = db2bp.exe CONNECT
授權標識 = DB2ADMIN
應用程序狀態 = 鎖定等待
應用程序代碼頁 = 1208
掛起的鎖定 = 4
總計等待時間(毫秒) = 247867
鎖定列表
鎖定名稱 = 0x5359534C564C3031DDECEF2841
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 2312
對象類型 = 行
表空間名 = IBMDB2SAMPLEREL
表模式 = DB2ADMIN
表名 = TEST
方式 = IX
查看鎖定的詳細信息:db2 get snapshot for locks for application agentid 1728
----(1728是句柄ID)
3、觀察命令db2 list applications的輸出
查看應用程序的狀態是否有鎖定等待(Lock-wait)狀態出現。
執行命令 list applications for db sample show detail;
4、db2 force application(句柄ID)
直接結束進程即可。

『伍』 db2資料庫裡面的一張表被鎖定該怎麼辦

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

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

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

『陸』 db2 如何查看死鎖的詳細信息

db2 list applications show detail | grep -i lock

如果是Windows系統,grep命令不好用,你就用list applications命令然後仔細找吧,找到後可以用get snapshot for application命令獲得快照,然後可以知道是誰hold了鎖,你就能順利解鎖了

『柒』 在C#中怎麼判斷DB2的SQL表有沒有鎖表啊

如果要插入目標表不存在: select * into 目標表 from 表 where ... 二:如果要插入目標表已經存在: insert into 目的表 select * fro

『捌』 db2 為什麼會鎖表

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

『玖』 如何解鎖DB2中被鎖定的表

1 表處於「檢查暫掛」狀態。未強製表的完整性並且表的內容可能是無效的
。如果從屬表處於檢查暫掛狀態,則對於未處於檢查暫掛的父表或基礎表的
操作也可能接收到此錯誤。
2 表處於「無數據移動」狀態。當處於此狀態時,禁止導致數據移動的操作
。數據移動操作包括 REDISTRIBUTE、
分區鍵的更新、多維群集鍵的更新和 REORG TABLE。
3 表處於「裝入暫掛」狀態。對此表的先前的 LOAD
嘗試失敗。在重新啟動或終止 LOAD 操作之前不允許對表進行存取。
4 表處於「只讀」狀態。此狀態可以在聯機裝入(LOAD)處理(帶有 READ
ACCESS 選項的 LOAD
INSERT)期間發生,或在聯機裝入(LOAD)操作後發生,除了在使用 SET
INTEGRITY 語句在表的新追加的部分驗證所有約束之前。不允許對此表的更
新活動。
5 表處於「正在裝入」狀態。LOAD 實用程序當前對此表進行操作,直到
LOAD 完成才允許存取。
6 不能在 ESE 中刷新引用昵稱的具體查詢表。
用戶響應:

1 對表 "<表名>" 執行帶有 IMMEDIATE CHECKED 選項的 SET INTEGRITY
語句,以消除表的「檢查暫掛」狀態。對於用戶維護的具體查詢表,執行帶
有 IMMEDIATE UNCHECKED 選項的語句,而不是帶 IMMEDIATE CHECKED
選項。
2 對表 "<表名>" 的從屬立即具體查詢表和分級表執行 REFRESH TABLE
語句。可以通過先前 LOAD INSERT 操作根據 "<表名>"
的追加數據以增量方式維護這些從屬立即具體化查詢表和分級表的內容。
3 通過分別發出帶有 RESTART 或 TERMINATER 選項的 LOAD
來重新啟動或終止先前失敗的對此表的 LOAD 操作。
4 發出 LOAD QUERY 命令以檢查該表是否正在裝入。如果是,則一直等到
LOAD 實用程序完成,或如有必要,重新啟動或終止先前失敗的「裝入」操作
。如果「裝入」當前未在進行,則發出帶有 IMMEDIATE CHECKED 選項的
SET INTEGRITY 命令以驗證表的新裝入部分中的約束。
5 一直等到當前 LOAD 操作完成。可用使用 LOAD QUERY
命令來監視裝入的進度。
6 使用 MAINTAIN BY USER
選項定義具體查詢表。然後,使用帶有子查詢的 INSERT
語句填充具體查詢表。

『拾』 用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上,則可以使用「控制中心」->實例->右鍵「應用程序」,可以看到當前的鎖定情況,並且可以強行關閉某個進程,也可以顯示「鎖定鏈」。