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公司收...