目錄
一、基本語法
2. lockmode
Oracle支持的鎖模式有ROW SHARE、ROW EXCLUSIVE、ROW UPDATE、SHARE、
2.1 EXLUSIVE排他鎖
表級鎖:當一個Session獲取到了排他鎖以后,其他用戶只能進行查詢操作,一般對一張表進行drop操作時獲得該鎖。
2.2 SHARE共享鎖
表級鎖:SHARE模式允許並發查詢,但是一個Session如果獲得了共享鎖,那么就不能對該表進行update操作。
2.3 ROW SHARE行共享模式
行級鎖:允許並發訪問,但是不允許用戶獨占式訪問。這個鎖模式等價於WITH SHARE UPDATE(以前老版本的寫法)
2.4 ROW EXCLUSIVE行排他模式
行級鎖:ROW EXCLUSIVE模式一般來說用戶不會手動進行設置,在一個Session會話對數據庫進行insert、update以及delete操作時,該用戶就會自動的獲取到這個ROW EXCLUSIVE鎖。在ROW EXCLUSIVE和ROW SHARE模式一樣,但是如果一個Session獲得了ROW EXCLUSIVE鎖,那么另外的Session就不能進行ROW EXCLUSIVE鎖定,也不能對該表進行SHARE鎖定。
2.4 SHARE ROW EXLUSIVE共享行排他
行級鎖:如果一個Session獲取了SHARE ROW EXLUSIVE鎖,該用戶以及其他用戶可以對整張表進行查詢,但是,不允許其他用戶對該表進行SHARE鎖定或者更新表的數據。
2.5 小結
① 如果一個table 被一個session鎖定,無論什么鎖定,另外的session就不能獲得對於該表exclusive的鎖定,也就是說不能刪除該表,其實很容易相同,別人在用那個表,你去把表給刪除了,肯定是不允許的.
② 如果能夠對某個表進行row exclusive 鎖定,那么肯定可以執行dml操作。
③可以這樣理解share鎖,顧名思義,共享鎖是用來共享的,既然是共享,所以其他用戶只能查看,不能更改。
④ 可以這樣理解exclusive鎖,顧名思義,排它鎖就是獨享的,其他用戶只能查看,不能修改。
2.6 for update 語句與鎖模式
begin;
select * from tickets from update of tnum
update tickets set tnum = tnum - 100 where tno = 1;
commit;
如果,在for update后面沒有寫of tnum,那么 這個Session就是做了一個表獨占的操作;如果加了of tum,指定了一張表中的一列數據,並且,使用where子句進行刪選,這個Session就是做了一個行獨占的操作。為了保證sql語句的執行性能,在寫sql語句時,應該盡量的做到行鎖定的模式,否則會影響到其他人的操作。
問題:
在設置事務的隔離級別后,進行不加for update的查詢操作,MySQL的優化器是否會自動進入到行級鎖的模式。