oracle:
awr(sql執行等資訊)->alert(報錯資訊)->trance日誌
1、檢視哪些會話鎖了哪些表
select l.session_id,o.owner,o.object_name
from v$locked_object l,dba_objects o
where l.object_id=o.object_id;
2、查詢鎖表的會話資訊
select s.username,s.sid,s.serial#,s.logon_time
from v$locked_object l,v$session s
where l.session_id=s.sid
order by s.logon_time;
3、根據查詢出的sid和serial#查詢會話資訊
select * from v$session where sid=48 and serial#=387;
4、根據3中查詢到的sql_id資訊查詢該會話執行的是什麼sql導致鎖
select sql_fulltext from v$sql where sql_id='5updgzg8hrrua';
---------------method 2---------------------
drop table ac_branch cascade constraints;
create table ac_branch
(branch varchar2(20 char) primary key not null,
settle_level varchar2(20 char) not null,
settle_branch varchar2(20 char),
settle_subject varchar2(30 char),
settle_acct_seq varchar2(20 char),
settle_subject_up varchar2(30 char),
settle_acct_seq_up varchar2(20 char)
)set autocommit off;
show autocommit;
select * from ac_branch where branch='1';
select * from ac_branch where branch='1' for update;
insert into ac_branch values('1', '2', '3', '4', '5', '6', '7');
2.鎖查詢sql:
select * from v$session where type='user' and username='test'; --會話的詳細資訊
select * from v$process; --顯示oracle所有程序的資訊(包括後台程序和伺服器程序)
select * from v$lock; --用於顯示鎖的資訊,通過與v$session進行連線查詢,可以顯示占有鎖的會話,以及等待鎖的會話
select a.username,a.machine,b.lmode,b.request from v$session a,v$lock b
where a.sid=b.sid and a.type='user';
select * from v$locked_object; --顯示被加鎖的資料庫物件,通過與dba_object進行連線查詢,
--可以顯示具體的物件名及執行加鎖操作的oracle使用者名稱
--(dba_為dba使用者擁有或可以訪問的物件,all_為當前使用者擁有或可以訪問的物件,user_為當前使用者擁有的物件)
select a.oracle_username,b.owner||'.'||b.object_name object from v$locked_object a,dba_objects b
where a.object_id = b.object_id;
select * from v$session_wait; --查詢使用者當前的等待資訊. 以檢視當前的語句為什麼這麼慢/在等待什麼資源.
select * from v$sqlarea; --根據sql_text進行group by的結果,v$sql中為每一條sql保留乙個條目
select * from dba_objects;
排查問題:
1. 查詢出被鎖物件(表)被哪幾個會話占用
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
2. 查詢出會話的相關資訊(會話唯一標識sid+serial#,鎖等待的sql_id,sql開始執行時間sql_exec_id;持有鎖會話的上一執行pre_sql_id,持有鎖會話上一執行sql的執行時間pre_exec_start)
select b.username,b.sid,b.serial#,b.logon_time,b.sql_id,b.sql_exec_start,b.prev_sql_id,b.prev_exec_start,b.module from v$locked_object a,v$session b where a.session_id = b.sid ;
3. 查詢鎖等待(或持有鎖會話的上一執行sql)的sql資訊:
select sql_id,sql_text,sql_fulltext,last_active_time,module,action,parsing_schema_name from v$sql where sql_id = '89k3d****r37p';
4. 查詢指定時間執行的sql:
select sql_id,sql_text,sql_fulltext,last_active_time,module,action,parsing_schema_name from v$sql where last_active_time=to_date('2019-11-05 15:05:33','yyyy-mm-dd hh24:mi:ss');
5. 確認若是認為原因導致的鎖,則kill掉會話:
alter system kill session'525,18065';
mysql:
1.查詢設定事務隔離級別(不同的事務隔離級別可能解決髒讀、不可重複讀、泛讀的問題)
select @@tx_isolation;
set session transaction isolation level serializable; --read uncommitted | read committed | repeatable | serializable
2.查詢事務、鎖、會話(mysql程序列表)的sql:
information_schema.processlist 當前會話(程序)列表
information_schema.innodb_trx 當前正在執行的事務(含sql已經執行完成,但事務沒有提交的事務,事務提交後,事務結束)
information_schema.innodb_lock_waits 鎖等待和持有鎖的關係
information_schema.innodb_locks 鎖的相關資訊(所等待的原因)
-- 查詢當前的會話 有 哪些有事務正在執行
select a.*,'分隔' as 分隔,b.* from
information_schema.processlist a -- 連線mysql的會話(程序列表)
left join
information_schema.innodb_trx b -- 正在執行的事務(事務從開始到commit,記錄會一直存在,sql語句執行完則不會顯示正在執行的sql。查詢也會啟事務)
on a.id = b.trx_mysql_thread_id;
-- 鎖等待和持有鎖的相互關係(request為需要鎖的事務id和鎖等待id,block為加鎖的事務id和持有鎖id)
select * from information_schema.innodb_lock_waits;
-- 鎖等待的原因
select * from information_schema.innodb_locks;
3.kill持有鎖的會話:
kill + id
4.測試相關語句:
mysql -h 10.7.20.160 -p 3306 -u root -proot
show variables like '%autocommit%';
set autocommit=off;
select * from ac_branch where branch='1';
select * from ac_branch where branch='1' for update;
insert into ac_branch value ('10', '2', '3', '4', '5', '6', '7');
commit;
資料庫鎖問題
為了保證資料的一致性。mysql資料庫存在多種資料引擎,mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行級鎖定和頁級鎖定。1.表級鎖 表級鎖一次會將整個表鎖定,所可以很好的避免死鎖問題 1 鎖定粒度大,鎖衝突概率高 併發度低 2 好處是不會出現死鎖 開銷小 獲取鎖和釋放鎖的速度很快...
資料庫鎖表問題
當多使用者對資料庫進行併發操作時是容易導致資料不一致的問題。一般解決方法是,盡量從業務邏輯的角度來規避這種問題,避免使用資料庫的鎖表功能,容易引起一些問題,如死鎖,長時間的等待鎖的釋放等。如有些系統,從業務邏輯上分析是無需鎖表的,如客戶關係管理系統,自己的使用者只能自己檢視修改,其它人沒有許可權檢視...
資料庫的鎖問題
事務的併發控制協議 oracle採用類似於多版本兩段鎖的協議 multiversion two phase lock protocol 多版本兩段鎖協議對唯讀事務和更新書屋加以區別,如果是唯讀事務則採用多版本控制協議,如果是更新事務則採用強兩段鎖協議。鎖分共享鎖 shared 和排他鎖 exclus...