mysql和oracle的锁_关于数据库行锁与表锁的认识
MySQL
MySQL(InnoDB存儲引擎)默認(rèn)是自動(dòng)提交事務(wù)的,所以這個(gè)測試,需要先將MySQL的autocommit設(shè)置為0,關(guān)閉自動(dòng)提交,需要自己手動(dòng)提交事務(wù)
-- 關(guān)閉自動(dòng)提交
set autocommit=0;
-- 開啟事務(wù)
begin;
這里我主要針對的是悲觀鎖,其實(shí)也就是行鎖和表鎖,SQL 加上 FOR UPDATE 即可
行鎖
這個(gè)時(shí)候,我們再開啟一個(gè)客戶端訪問MySQL,輸入同一條加鎖的SQL查詢
這個(gè)時(shí)候是沒有任何結(jié)果的,因?yàn)閠_card表已經(jīng)加鎖了(這個(gè)時(shí)候其實(shí)加的是行鎖),所以cardid=‘1’ 這一行的其他加鎖操作是無效的
但是不加鎖查詢這一條記錄卻是可以的
也就是說雖然這一條記錄所在的行被鎖定了,但是并不影響我們正常的查詢,當(dāng)然了針對這一行的DML操作也是無效的
那如果我們對除了cardid=‘1’ 的其他行操作會怎樣呢?
對于其他的行DML是完全沒問題的,所以我在前面才說這是行鎖,因?yàn)橹挥形覀兊腸ardid=‘1’的行被鎖了
好吧,我們放過cardid=‘1’這一行吧
提交事務(wù)之后,另一邊的加鎖SQL才會生效
表鎖
上面我們測試的只是行鎖,那表鎖,或者說怎樣才會發(fā)生表鎖?
沒錯(cuò),我們不根據(jù)主鍵查詢,而是查詢所有的記錄,MySQL就對整張表加鎖了,這不就是表鎖了嘛。對于這張表的任何記錄進(jìn)行DML都是無效的
同時(shí)我們對于這張表的任何行進(jìn)行加鎖SQL操作是無效的,那普通的SQL查詢又怎樣呢?
還好,這不妨礙我們的普通查詢,畢竟查詢是與鎖這東西沒什么緣分的
結(jié)論
只要有鎖存在的地方(無論是一行還是整張表),我們對有鎖的地方進(jìn)行任何加鎖SQL都是無效的,當(dāng)然了DML也是無效的;但是我們的普通查詢是沒有問題的,同時(shí)對于沒有鎖的行也是可以進(jìn)行DML操作的
至于如何解除鎖,可以查看這篇博客:?https://zhengdl126.iteye.com/blog/1570865 。最后記得把MySQL的autocommit = 1
Oracle
Oracle是需要我們手動(dòng)提交事務(wù)的,所以,我們不需要任何設(shè)置即可測試
只有提交事務(wù)之后,另一邊才會生效,同樣的普通查詢是沒有問題的。如果不根據(jù)主鍵查詢,就會鎖整張表。最后的結(jié)論是與MySQL一致的
查看哪張表被鎖以及解鎖
-- 查看哪張表被鎖
SELECT object_name, machine, s.sid, s.serial#, logon_time, locked_mode
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
-- 解鎖(根據(jù)上邊SQL查詢結(jié)果得到sid和serial#)
--alter system kill session ‘sid,serial#‘;
ALTER system kill session ‘23,1647‘;
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的mysql和oracle的锁_关于数据库行锁与表锁的认识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Longhorn明年5月完成 微软将推7
- 下一篇: linux cmake编译源码,linu