no-image

MySQL設定鎖、事務隔離級別的常用命令

                                    

1、檢視錶鎖, Table_locks_waited較高表明鎖爭用比較嚴重

 

[sql] view plain copy

show status like ‘table%’  

 

2、檢視行鎖,Innodb_row_lock_waits和InnoDB_row_lock_time_avg較高表明鎖爭用比較嚴重

 

[sql] view plain copy

show status like ‘innodb_row_lock%’  

 

3、加寫表鎖(需手動unclock tables,用commit不會自動解鎖)

 

[sql] view plain copy

lock table user write;  

4、加讀表鎖(需手動unclock tables,用commit不會自動解鎖)

 

 

[sql] view plain copy

lock table user read;  

5、加讀表鎖(需手動unclock tables,用commit不會自動解鎖),並支援另一個事務的insert操作

 

 

[sql] view plain copy

lock table user read local;  

6、加共享行鎖(提交事務,自動解鎖)

 

 

[sql] view plain copy

select * from user where id=2 lock in share mode;   

7、加排他行鎖(提交事務,自動解鎖)

 

 

[sql] view plain copy

delete from user where id=2 for update;  

 

8、其他說明

INSERT…SELECT…和 CREATE TABLE…SELECT…語句,會鎖原表

 

[sql] view plain copy

set global concurrent_insert=2; — 設定是否開啟併發insert,0=不開啟,1=沒有空洞的情況下,允許insert,2=不管有沒有空洞,都允許插入  
select @@LOW_PRIORITY_UPDATES; — 預設情況下,寫鎖比讀鎖優先順序高,所以寫鎖會先得到鎖,用這個命令可以降低寫鎖的級別  
select @@max_write_lock_count; — 當寫鎖達到指定數量,會降低寫鎖優先順序  

事務

 

1、開啟事務

 

[sql] view plain copy

set autocommit=0; — 先取消自動事務提交  
start transaction; — 手動開啟事務  

 

 

2、提交事務(不會自動釋放表鎖)

 

 

[sql] view plain copy

commit;  

3、回滾事務

 

 

[sql] view plain copy

rollback;  

 

4、設定事務的隔離級別為“未提交讀”(可能導致髒讀)

 

[sql] view plain copy

set session transaction isolation level read uncommitted;  

 

5、設定事務的隔離級別為“已提交讀讀”(可能導致不可重複讀)

 

[sql] view plain copy

set session transaction isolation level read committed;  

6、設定事務的隔離級別為“可重複讀”(可能導致幻讀)

 

[sql] view plain copy

set session transaction isolation level repeatable read;  

7、設定事務的隔離級別為“序列化”

 

[sql] view plain copy

set session transaction isolation level serializable;  

8、檢視資料庫的事務隔離級別

 

[sql] view plain copy

select @@global.tx_isolation, @@session.tx_isolation;  

 


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}