mysql行鎖和表鎖 關於資料庫行鎖與表鎖的認識

2021-10-19 19:48:04 字數 2168 閱讀 7418

mysql

mysql(innodb儲存引擎)預設是自動提交事務的,所以這個測試,需要先將mysql的autocommit設定為0,關閉自動提交,需要自己手動提交事務

-- 關閉自動提交

set autocommit=0;

-- 開啟事務

begin;

這裡我主要針對的是悲觀鎖,其實也就是行鎖和表鎖,sql 加上 for update 即可

行鎖這個時候,我們再開啟乙個客戶端訪問mysql,輸入同一條加鎖的sql查詢

這個時候是沒有任何結果的,因為t_card表已經加鎖了(這個時候其實加的是行鎖),所以cardid=『1』 這一行的其他加鎖操作是無效的

但是不加鎖查詢這一條記錄卻是可以的

也就是說雖然這一條記錄所在的行被鎖定了,但是並不影響我們正常的查詢,當然了針對這一行的dml操作也是無效的

那如果我們對除了cardid=『1』 的其他行操作會怎樣呢?

對於其他的行dml是完全沒問題的,所以我在前面才說這是行鎖,因為只有我們的cardid=『1』的行被鎖了

好吧,我們放過cardid=『1』這一行吧

提交事務之後,另一邊的加鎖sql才會生效

表鎖上面我們測試的只是行鎖,那錶鎖,或者說怎樣才會發生表鎖?

沒錯,我們不根據主鍵查詢,而是查詢所有的記錄,mysql就對整張表加鎖了,這不就是表鎖了嘛。對於這張表的任何記錄進行dml都是無效的

同時我們對於這張表的任何行進行加鎖sql操作是無效的,那普通的sql查詢又怎樣呢?

還好,這不妨礙我們的普通查詢,畢竟查詢是與鎖這東西沒什麼緣分的

結論只要有鎖存在的地方(無論是一行還是整張表),我們對有鎖的地方進行任何加鎖sql都是無效的,當然了dml也是無效的;但是我們的普通查詢是沒有問題的,同時對於沒有鎖的行也是可以進行dml操作的

至於如何解除鎖,可以檢視這篇部落格:  。最後記得把mysql的autocommit = 1

oracle

oracle是需要我們手動提交事務的,所以,我們不需要任何設定即可測試

只有提交事務之後,另一邊才會生效,同樣的普通查詢是沒有問題的。如果不根據主鍵查詢,就會鎖整張表。最後的結論是與mysql一致的

檢視哪張表被鎖以及解鎖

-- 檢視哪張表被鎖

select object_name, machine, s.sid, s.serial#, logon_time, locked_mode

from **$locked_object l, dba_objects o, **$session s

where l.object_id = o.object_id

and l.session_id = s.sid;

-- 解鎖(根據上邊sql查詢結果得到sid和serial#)

--alter system kill session 'sid,serial#';

alter system kill session '23,1647';

Mysql 資料庫表鎖 行鎖

偏向myisam,開銷小,加鎖快,無死鎖,鎖粒度大,發生鎖衝突的概率較高,併發度較低。測試表,用於表加鎖後的讀寫可能性驗證 create table if not exists table lock id int 10 primary key not null auto increment comm...

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...

資料庫中的行鎖和表鎖

myisam儲存引擎只支援表鎖,這也是mysql開始幾個版本中唯一支援的鎖型別。隨著應用對事務完整性和併發性要求的不斷提高,mysql才開始開發基於事務的儲存引擎,後來慢慢出現了支援頁鎖的bdb儲存引擎和支援行鎖的innodb儲存引擎 實際 innodb是單獨的乙個公司,現在已經被oracle公司收...