使用lock tables後,在鎖定期間需要在其他執行緒使用其他別的未鎖定表,需要慎用鎖定,可能讀寫失敗等奇怪現象
參考:寫鎖定:lock tables lrcolumnsdesc write;
寫鎖,鎖定之後,只有當前執行緒只可以對lrcolumnsdesc進行讀操作和寫操作,其他執行緒對對products讀操作和寫操作均被堵塞.....
如果當前執行緒需對其他的表的讀寫,也要加入鎖否則報錯,table 'lucht05' was not locked with lock tables
其他執行緒對lrcolumnsdesc的上讀寫鎖都被阻塞
lock tables lrcolumnsdesc write
select * from lrcolumnsdesc --可查詢
select * from lucht05 --報異常 lucht05 未加鎖
unlock tables
lock tables lrcolumnsdesc write,lucht05 write
select * from lrcolumnsdesc --可查詢
select * from lucht05 --可查詢
unlock tables
讀鎖定:lock tables lrcolumnsdesc read;
讀鎖,鎖定之後,無論是當前執行緒還是其他執行緒均只能讀操作,寫操作全部被堵塞....
如果當前執行緒需對其他的表的讀寫,也要加入鎖否則報錯,table 'lucht05' was not locked with lock tables
其他執行緒可以同時對lrcolumnsdesc的上讀鎖
寫鎖只能乙個執行緒上其他執行緒讀寫鎖都被堵塞
讀鎖可以在多個執行緒同時上
解鎖:unlock tables;
解鎖只解鎖當前執行緒的鎖,
以下再innodb下測試,發現存在鎖不住的情況 ,表中uid連續但是存在uid的範圍差和dt的數量不一致
參考:lock tables 隱含提交事務,開始事務(start transaction)隱含unlock tables 需要將autocommit=0
set autocommit=0;設定後,以下程式碼執行依然存在沒有鎖住情況
設定全域性的後鎖有效
show global variables like 'autocommit';
set global autocommit=0;//這樣設定後,可能會導致在鎖定期間對其他操作未鎖定的表的讀寫失敗
sqlhelper conn = new sqlhelper();
using (conn)
multinsert(conn, dt, tablename, "from_sit", sitno);
//獲取執行後最大uid
dtemp = conn.opendatatable("select ifnull(max(uid),0) from " + tablename, commandtype.text);
if (dtemp.rows.count > 0)
conn.commit();
conn.executesql("unlock tables");//只解鎖當前執行緒的鎖
}catch (exception ex)
}dtemp.dispose();
dtemp = null;
}}
mysql 鎖表與解鎖
連線mysql 直接執行unlock tables,細節如下 查詢是否鎖表 show open tables 查詢程序 show processlist 查詢到相對應的程序,然後殺死程序 kill id 一般到這一步就解鎖了 檢視正在鎖的事務 select from information sche...
MySQL 鎖表與解鎖步驟
1.使用大於0表 show open tables where database test and in use 0 2.request trx id請求鎖 與 blocking trx id產生鎖原因 select from information schema.innodb lock waits...
mysql解鎖 mysql鎖表如何解鎖
什麼是mysql鎖表?為了給高併發情況下的mysql進行更好的優化,有必要了解一下mysql查詢更新時的鎖表機制。mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level ...