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
怎么能查到造成鎖等待的SQL語句
sql server:
Select * from sysprocesses where blocked0
--找到SPID
exec sp_lock
--根據SPID找到OBJID
select object_name(85575343)
--根據OBJID找到表名
Oracle:
SELECT *,
*#,
*_NAME,
*N_ID,
*_USERNAME,
*_USER_NAME
FROM V$PROCESS P,
V$SESSION A,
V$LOCKED_OBJECT B,
ALL_OBJECTS C
WHERE * = *
AND *S = *S
AND *_ID = *_ID;
sql 鎖 的概念
舉個例子吧 當你要進一個房間的時候,你想推門,這個時候剛好有個人想出來,他也想推門出去,于是,兩個人就卡在那了,結果,后面排隊的人也都動彈不了了,假如這個房間是個數據庫,那么,數據庫這個時候就卡殼了。
鎖正是為避免這種情況出現的
悲觀鎖就是 一個一個來,當有人想進這個房間的時候,其他人都別動
但假如這個房間有很多門,這些門通往不同的地方,比如,有可以直接進洗手間的,有可以進廚房的,結果,你一個人想去臥室,卻禁止其他人進洗手間,這樣對效率就會產生影響。于是,樂觀所就是,當你想進的時候,等到你來到門的門口,才把當前這個門鎖住。之所以叫樂觀,也就是說,樂觀地假定你的行為不會影響到其他人,等到影響到的時候再加鎖。而悲觀的意思,就是一開始就假定你會影響到其他人了,所以全部鎖了干凈。
并不是說樂觀鎖一定好過悲觀鎖。樂觀鎖可能會產生臟數據(具體的書里巴拉巴拉講了一堆,就忘了。。)
恩 大概是這樣啦,具體語法就要自己去搜啦
查看Oracle中是否有鎖表的sql
oracle的鎖是個龐大的體系,種類很多,建議你專門搜尋資料學習一下。
從你的問題提問來看,你應該是問事務鎖,也就是常見的TX鎖,即dml操作帶來的鎖表。
----------------------------------------------------------------------------------------------------------
你可以用如下語句看到表上鎖等待情況:(集群或單實例環境通用)
SELECT DECODE(request,0,'Holder: ','Waiter: ')||inst_id , sid ,
id1, id2, lmode, request, type,CTIME
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request;
然后根據查出的sid,尋找sql語句:
select *ME,*||','||*#,'kill -9 '||*,*,*_ID,*,*,*_CLASS,*M,*E,*S_IN_WAIT,*_CALL_ET,*_TEXT ,*_FULLTEXT,*ME from v$session s,v$sqlarea sq ,v$process p
where * = * and *_ID = *_ID(+)
and * = 355 ;
------------------------------------------------------------------------------------
上面查找鎖的sql語句,需要你學習下鎖的級別,類型等知識。
關于SQL的鎖
在語句中使用ROWLOCK選項
比如
select *
from 表 (ROWLOCK)
where 。
各種操作的默認鎖定級別是不一樣的。
行是可以鎖定的最小空間。在SQL Server 7.0中,實現了行級鎖。行級鎖就是指事務在操縱數據的過程中,鎖定一行或者若干行數據,其他事務不能同時處理這些行的數據。行級鎖占用的數據資源最少,所以在事務的處理過程中,允許其他事務繼續操縱同一個表或者同一個頁的其他數據,大大降低了其他事務等待處理的時間,提高了系統的并發性。頁級鎖是一種最優鎖,因為行級鎖不可能出現數據既被占用又沒有使用的浪費現象。在圖5中,橢圓形表示行級鎖占用的數據,而橢圓形之外的其他數據仍然可以由其他事務使用。行級鎖是SQL Server 7.0的重要特征,它的引入引起了數據存儲引擎的改變。
oracle 鎖表時,怎么查出是哪些SQL語句導致了鎖表
SELECT * SESSION_ID, *ME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, *||'.'||*_NAME||' ('||*_TYPE||')', * LOCK_TYPE, *1 LOCK_ID1, *2 LOCK_ID2
FROM V$LOCK L, *_OBJECTS O, V$SESSION S
WHERE * = * AND *1 = *_ID;
執行上記SQL語句,可以查尋到數據庫中的鎖的情報.
SESSION_ID, USERNAME, MODE_HELD, MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID
分別是 擁有鎖的SESSION_ID,擁有鎖的USERNAME,鎖的執行模式MODE_HELD,鎖的請求MODE_REQUESTED,鎖所在的數據庫對象名
,鎖的類型,鎖的ID
還有你問的應該是數據庫中表出現死鎖情況吧,是哪些sql過程導致了表死鎖:
解決方案如下:
1.查哪個過程被鎖:
查V$DB_OBJECT_CACHE視圖:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='過程的所屬用戶' AND CLOCKS!='0';
2. 查是哪一個SID,通過SID可知道是哪個SESSION:
查V$ACCESS視圖:
SELECT * FROM V$ACCESS WHERE OWNER='過程的所屬用戶' AND NAME='剛才查到的過程名';
3. 查出SID和SERIAL#:
查V$SESSION視圖:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID';
查V$PROCESS視圖:
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR';
4. 殺進程:
(1)先殺ORACLE進程:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2)再殺操作系統進程: (linux)
KILL -9 剛才查出的SPID或ORAKILL 剛才查出的SID 剛才查出的SPID。
SQL 各種鎖
SQL Server數據庫發生死鎖時不會象ORACLE那樣自動生成一個跟蹤文件.
有時可以在[管理]->;[當前活動] 里看到阻塞信息(有時SQL Server企業管理器會因為鎖太多而沒有響應).
設定跟蹤1204:
USE MASTER
DBCC TRACEON (1204,-1)
顯示當前啟用的所有跟蹤標記的狀態:
DBCC TRACESTATUS(-1)
取消跟蹤1204:
DBCC TRACEOFF (1204,-1)
在設定跟蹤1204后,會在數據庫的日志文件里顯示SQL Server數據庫死鎖時一些信息,
但那些信息很難看懂,需要對照SQL Server聯機叢書仔細來看.
根據PAG鎖要找到相關數據庫表的方法:
DBCC TRACEON (3604)
DBCC PAGE (db_id,file_id,page_no)
DBCC TRACEOFF (3604)
請參考*上更詳細的講解.
從CSDN學到了一個找到死鎖原因的方法.
我稍加修改, 去掉了游標操作并增加了一些提示信息,寫了一個系統存儲過程sp_who_*.
需要的時候直接調用:
sp_who_lock
就可以查出引起死鎖的進程和SQL語句.
SQL Server自帶的系統存儲過程sp_who和sp_lock也可以用來查找阻塞和死鎖, 但沒有這里介紹的方法好用.
如果想知道其它tracenum參數的含義,請看*文章
我們還可以設置鎖的超時時間(單位是毫秒), 來縮短死鎖可能影響的時間范圍:
例如:
use master
seelct @@lock_timeout
set lock_timeout 900000
-- 15分鐘
seelct @@lock_timeout