⑴ 死鎖後關閉TOMCAT,資料庫能否自動解鎖
如果沒有其他資源佔用表資源的話,資料庫會自動釋放鎖,
MySQL解鎖命令是:
show processlist;
找到鎖進程,kill id ;
Oracle 解鎖命令是:
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
--殺掉進程 sid,serial#
alter system kill session sid,serial#;
⑵ mysql資料庫鎖表如何解鎖
當前運行的所有事務
select * from information_schema.innodb_trx
當前出現的鎖
select * from information_schema.innodb_locks
鎖等待的對應關系
select * from information_schema.innodb_lock_waits
通過找到線程id號,進行kill
通過 select * from information_schema.innodb_trx 查詢 trx_mysql_thread_id然後執行 kill 線程ID
⑶ mysql 表鎖住了,怎麼解鎖
對於寫鎖定如下:
1)、如果表沒有加鎖,那麼對其加寫鎖定。
2)、否則,那麼把請求放入寫鎖隊列中。
對於讀鎖定如下:
1)、如果表沒有加寫鎖,那麼加一個讀鎖。
2)、否則,那麼把請求放到讀鎖隊列中。
當然我們可以分別用low_priority 以及high_priority在寫和讀操作上來改變這些行為。
⑷ 用sql語句,怎麼解決mysql資料庫死鎖
MySQL死鎖問題的相關知識是本文我們主要要介紹的內容,接下來我們就來一一介紹這部分內容,希望能夠對您有所幫助。
1、MySQL常用存儲引擎的鎖機制
MyISAM和MEMORY採用表級鎖(table-level locking)
BDB採用頁面鎖(page-level locking)或表級鎖,默認為頁面鎖
InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖
2、各種鎖特點
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發度也最高
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般
3、各種鎖的適用場景
表級鎖更適合於以查詢為主,只有少量按索引條件更新數據的應用,如Web應用
行級鎖則更適合於有大量按索引條件並發更新數據,同時又有並發查詢的應用,如一些在線事務處理系統
4、死鎖
是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
表級鎖不會產生死鎖。所以解決死鎖主要還是針對於最常用的InnoDB。
5、死鎖舉例分析
在MySQL中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,MySQL就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。
在UPDATE、DELETE操作時,MySQL不僅鎖定WHERE條件掃描過的所有索引記錄,而且會鎖定相鄰的鍵值,即所謂的next-key locking。
例如,一個表db。tab_test,結構如下:
id:主鍵;
state:狀態;
time:時間;
索引:idx_1(state,time)
出現死鎖日誌如下:
?***(1) TRANSACTION:
?TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OSthread id 278546 starting index read
?mysql tables in use 1, locked 1
?LOCK WAIT 3 lock struct(s), heap size 320
?MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
?update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute) (任務1的sql語句)
?***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任務1等待的索引記錄)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _mode X locks rec but not gap waiting
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) TRANSACTION:
?TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
?mysql tables in use 1, locked 1
?3 lock struct(s), heap size 320, undo log entries 1
?MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任務2的sql語句)
?*** (2) HOLDS THE LOCK(S): (任務2已獲得的鎖)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任務2等待的鎖)
?RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap waiting
?Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
?0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;
?*** WE ROLL BACK TRANSACTION (1)
?(回滾了任務1,以解除死鎖)
原因分析:
當「update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute)」執行時,MySQL會使用idx_1索引,因此首先鎖定相關的索引記錄,因為idx_1是非主鍵索引,為執行該語句,MySQL還會鎖定主鍵索引。
假設「update tab_test set state=1067,time=now () where id in (9921180)」幾乎同時執行時,本語句首先鎖定主鍵索引,由於需要更新state的值,所以還需要鎖定idx_1的某些索引記錄。
這樣第一條語句鎖定了idx_1的記錄,等待主鍵索引,而第二條語句則鎖定了主鍵索引記錄,而等待idx_1的記錄,這樣死鎖就產生了。
6、解決辦法
拆分第一條sql,先查出符合條件的主鍵值,再按照主鍵更新記錄:
?select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);
?update tab_test state=1064,time=now() where id in(......);
⑸ 如何利用MySQL資料庫鎖定和解鎖資料庫表
第一步,創建資料庫表writer和查看錶結構,利用SQL語句:
create table writer(
wid int(10),
wno int(10),
wname varchar(20),
wsex varchar(2),
wage int(2)
);
desc writer;
如下圖所示:
第二步,向資料庫表writer插入五條數據,插入後查看錶里數據,如下圖所示:
第三步,利用鎖定語句鎖定資料庫表writer,利用SQL語句:
lock table writer read;
讓資料庫表只讀不能進行寫
如下圖所示:
第四步,為了驗證鎖定效果,可以查看資料庫表數據,利用SQL語句:
select * from writer;
如下圖所示:
第五步,利用update語句對id=5進行更新,SQL語句為:
update writer set wname = '胡思思' where id = 5;
如下圖所示:
6
第六步,利用unlock進行解鎖,SQL語句為:
unlock tables;
如下圖所示:
⑹ 如何清理mysql資料庫緩存數據
1、打開mysql的客戶端 這里使用navicat,連接資料庫,等到navicat主頁面,雙擊需要操作的資料庫連接。
⑺ 如何對MySQL資料庫表進行鎖定
伺服器由兩種表的鎖定方法:
1.內部鎖定
內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的SELECT查詢被另一個客戶機的UPDATE查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對表的訪問。
語法:
鎖定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]
解鎖表:UNLOCK TABLES
LOCK TABLES為當前線程鎖定表。UNLOCK TABLES釋放被當前線程持有的任何鎖。當線程發出另外一個LOCK TABLES時,或當伺服器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。
如果一個線程獲得在一個表上的一個READ鎖,該線程(和所有其他線程)只能從表中讀。如果一個線程獲得一個表上的一個WRITE鎖,那麼只有持鎖的線程READ或WRITE表,其他線程被阻止。
每個線程等待(沒有超時)直到它獲得它請求的所有鎖。
WRITE鎖通常比READ鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果一個線程獲得READ鎖,並且然後另外一個線程請求一個WRITE鎖, 隨後的READ鎖請求將等待直到WRITE線程得到了鎖並且釋放了它。
顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。
2.外部鎖定
伺服器還可以使用外部鎖定(文件級鎖)來防止其它程序在伺服器使用表時修改文件。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對運行myisamchk或isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。
如果伺服器用--skip-locking選項運行,則外部鎖定禁用。該選項在某些系統中是預設的,如Linux。可以通過運行mysqladmin variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:
◆
如果skip_locking為off,則外部鎖定有效您可以繼續並運行人和一個實用程序來檢查表。伺服器和實用程序將合作對表進行訪問。但是,運行任何一個實用程序之前,應該使用mysqladmin
flush-tables。為了修復表,應該使用表的修復鎖定協議。
◆
如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協議告訴伺服器是該表不被其他客戶機訪問。
檢查表的鎖定協議
本節只介紹如果使用表的內部鎖定。對於檢查表的鎖定協議,此過程只針對表的檢查,不針對表的修復。
1.調用mysql發布下列語句:
$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;
該鎖防止其它客戶機在檢查時寫入該表和修改該表。FLUSH語句導致伺服器關閉表的文件,它將刷新仍在告訴緩存中的任何為寫入的改變。
2.執行檢查過程
$myisamchk tbl_name$ isamchk tbl_name
3.釋放表鎖
mysql>UNLOCK TABLES;
如果myisamchk或isamchk指出發現該表的問題,將需要執行表的修復。
修復表的鎖定協議
這里只介紹如果使用表的內部鎖定。修復表的鎖定過程類似於檢查表的鎖定過程,但有兩個區別。第一,你必須得到寫鎖而非讀鎖。由於你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執行修復之後發布FLUSH
TABLE語句,因為myisamchk和isamchk建立的新的索引文件,除非再次刷新改表的高速緩存,否則伺服器不會注意到這個改變。本例同樣適合優化表的過程。
1.調用mysql發布下列語句:
$mysql –u root –p db_namemysql>LOCK TABLE tbl_name WRITE;mysql>FLUSH TABLES;
2.做數據表的拷貝,然後運行myisamchk和isamchk:
$cp tbl_name.* /some/other/dir$myisamchk --recover tbl_name$ isamchk --recover tbl_name
--recover選項只是針對安裝而設置的。這些特殊選項的選擇將取決與你執行修復的類型。
3.再次刷新高速緩存,並釋放表鎖:
mysql>FLUSH TABLES;mysql>UNLOCK TABLES;
⑻ java程序中如何實現對mysql資料庫中表的鎖定
方法1:用mysql命令鎖住表.
publicvoidtest(){
Stringsql="locktablesaa1write";
//或Stringsql="locktablesaa1read";
//如果想鎖多個表locktablesaa1read,aa2write,.....
Stringsql1="select*fromaa1";
Stringsql2="unlocktables";
try{
this.pstmt=conn.prepareStatement(sql);
this.pstmt1=conn.prepareStatement(sql1);
this.pstmt2=conn.prepareStatement(sql2);
pstmt.executeQuery();
pstmt1.executeQuery();
pstmt2.executeQuery();
}catch(Exceptione){
System.out.println("異常"+e.getMessage());
}
}
對於read lock 和 write lock官方說明:
1.如果一個線程獲得一個表的READ鎖定,該線程(和所有其它線程)只能從該表中讀取。
如果一個線程獲得一個表的WRITE鎖定,只有保持鎖定的線程可以對表進行寫入。
其它的線程被阻止,直到鎖定被釋放時為止。
2.當您使用LOCK TABLES時,您必須鎖定您打算在查詢中使用的所有的表。
雖然使用LOCKTABLES語句獲得的鎖定仍然有效,但是您不能訪問沒有被此語句鎖定的任何的表。
同時,您不能在一次查詢中多次使用一個已鎖定的表——使用別名代替,
在此情況下,您必須分別獲得對每個別名的鎖定。
對與read lock 和 write lock個人說明:
1.read lock 和 write lock 是線程級(表級別).
2.在同一個會話中加了read lock鎖. 只能對這個表進行讀操作.對這個表以外的任何錶都無法進行增、刪、改、查的操作.
但是在不同會話中,只能對加了read lock的表進行讀操作.但可以對read lock以外的表進行增、刪、改、查的操作.
3.在同一個會話中加了write lock鎖.只能對這個表進行讀、寫操作.對這個表以外的任何錶都無法進行增、刪、改、查的操作.
但是在不同會話中,無法對加了write lock的表進行讀、寫操作.但可以對write lock以外的表進行增、刪、改、查的操作.
4.如果表中使用了別名.(SELECT * FROM aa1 AS byname_table)
在對aa1加鎖時,必須把別名加上去(lock tables aa1 as byname_table read)
在同一個會話中.必須使用別名進行查詢.
在不同的會話中.可以不需要使用別名進行查詢.
5.在多個會話中可以對同一個表進行lock read操作.但不能在多個會話中對同一個表進行lock write操作(這些鎖將等待已鎖的表釋放自身的線程鎖)
如果多個會話對同一個表進行lock read操作.那麼在這些會話中,也只能對以鎖的表進行讀操作.
6.如果要你鎖住了一個表,需要嵌套查詢.你必須使用別名,並且,要鎖定別名.
例如.lock table aa1 read ,aa1 as byname_table read;
select * from aa1 where id in (select * from aa1 as xxwhere id=2);
7.解鎖必須用unlock tables;
另:
在JAVA程序中,要想解鎖,需要調用 unlock tables來解鎖.
如果沒有調用unlock tables.
關閉connection 、程序結束 、調用GC 都能解鎖.
方法2:用記錄鎖鎖表.
publicvoidtest(){
Stringsql="select*fromaa1forupdate";
//select*fromaa1lockinsharemode;
try{
conn.setAutoCommit(false);
this.pstmt=conn.prepareStatement(sql);
pstmt.executeQuery();
}catch(Exceptione){
System.out.println("異常"+e.getMessage());
}
}
1.for update 與 lock in share mode 屬於行級鎖和頁級鎖
2.for update 排它鎖,lock in share mode 共享鎖
3.對於記錄鎖.必須開啟事務.
4.行級鎖定事實上是索引記錄的鎖定.只要是用索引掃描的行(或沒索引全表掃描的行),都將被鎖住.
5.在不同的隔離級別下還會使用next-key locking演算法.即所掃描的行之間的「間隙」也會也鎖住(在Repeatable read和Serializable隔離級別下有間隙鎖).
6.在mysql中共享鎖的含義是:在被共享鎖鎖住的行,即使內容被修改且並沒有提交.在另一個會話中依然看到最新修改的信息.
在同一會話中加上了共享鎖.可以對這個表以及這個表以外的所有表進行增、刪、改、查的操作.
在不同的會話中.可以查到共享鎖鎖住行的最新消息.但是在Read Uncommitted隔離級別下不能對鎖住的表進行刪,
改操作.(需要等待鎖釋放才能操作...)
在Read Committed隔離級別下不能對鎖住的表進行刪,改操作.(需要等待鎖釋放才能操作...)
在Repeatable read隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)
在Serializable隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)
7.在mysql中排他鎖的含義是:在被排它鎖鎖住的行,內容修改並沒提交,在另一個會話中不會看到最新修改的信息。
在不同的會話中.可以查到共享鎖鎖住行的最新消息.但是Read Uncommitted隔離級別下不能對鎖住的表進行刪,
改操作.(需要等待鎖釋放才能操作...)
在Read Committed隔離級別下不能對鎖住的表進行刪,改操作.(需要等待鎖釋放才能操作...)
在Repeatable read隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)
在Serializable隔離級別下不能對鎖住行進行增、刪、改操作. (需要等待鎖釋放才能操作...)
8.在同一個會話中的可以疊加多個共享鎖和排他鎖.在多個會話中,需要等待鎖的釋放.
9.SQL中的update 與 for update是一樣的原理.
10.等待超時的參數設置:innodb_lock_wait_timeout=50 (單位秒).
11.任何可以觸發事務提交的命令,都可以關閉共享鎖和排它鎖.
⑼ 如何修改 Mysql 表 的屬性(將只讀改為可讀寫),只改表不改庫
如果是sqlserver資料庫,其實對於某列上不存在不讓修改的說法,sqlserver資料庫數據控制原理是角色控制,也就是說我們對於某一個角色去下定義,讓隸屬於這個角色的用戶不能夠更新數據。或者在某個角色的基礎上不分配或是回收對某一列的許可權!如果是這種情況,用一個能修改的角度登陸才行。
還有另一種就是所謂的觸發器,一旦發現你修改,立即返回原數據,這樣你也是永遠修改不了的!這時你要找到那個觸發器,將觸發器刪除後再進行修改,然後加回觸發器即可!
但這兩種情況都是對某一列下的定義(我們稱為鎖定粒度為列)不可能是某一個單元格!
如果你是站在erp管理的基礎上不讓你修改那是十分正常的!
在企業管理器中使用圖形方式(如二樓給的圖)還是語句,則沒有任何的區別!