Oracle锁相关(LOCK TABLE)

目录

一、基本语法

事务锁语法

2. lockmode

        Oracle支持的锁模式有ROW SHAREROW EXCLUSIVEROW UPDATESHARE

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的优化器是否会自动进入到行级锁的模式。

猜你喜欢

转载自blog.csdn.net/pangbianlaogu/article/details/80262201