目录
[TOC]
一、基本语法
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的优化器是否会自动进入到行级锁的模式。