第二十九讲--锁基础原理

         Oracle实例里面的sharedpool、buffer cache、log buffer在内存的SGA(shared global area)里面,也就是说所有的前台进程(PGA)和后台进程(DBWR、LGWR)都可以访问。后台进程数量有限(十几个),而且后台进程的工作负载并不重,对oracle数据库来讲最多的进程是server process,一个session对应一个链接,一个链接对应一个server process。所有的前台后台进程都访问SGA,这就构成并发。

         因为oracle有锁,故oracle支持并发。

         Oracle有两种锁:latch锁和lock锁。

         需要并发保护的东西:

1.chain(链),在内存的sharedpool、buffer cache里有很多数据块,很多chunk,这些chunk被串在链上。server process访问chunk时遍历链,遍历链才能找到chunk,chain会被server process并发访问,这时需要latch锁来保护。Server process在访问链时,先要获得链的latch锁,访问完自动释放latch。Latch锁就是用来保护链的

2.buffer(数据块和数据行),这时用的是lock锁。Lock锁细分为排它锁(X)和共享锁(S)。

 

2、行级锁:DML语句

Oracle的行级锁(X):lock锁的最小粒度单位是行。SQLserver在访问一行数据时会把行所在的数据块锁住,故SQL server的并发性不如oracle。会话一在修改数据行时加的是排它锁(X),并不影响会话二对数据块和数据行的读,因为可以构造CR块。

 

3、表级锁:TM

Oracle的事务锁(TX):一个事务可以修改很多行,可以在很多行上加行级锁,但是一个事务只有一个事务锁,事务锁是由行级锁产生的。Commit和rollback就可以实现事务锁的解锁。DML语句就是事务锁的加锁。一个事务有了行级锁就有了事务锁

 

Oracle的表级锁(RX):A事务在修改一张表的某一行数据的时候给这行数据加了一个行级锁(X),然后A事务自己产生了一个事务锁(TX),A事务在表的级别上加了一个表级锁(RX)。此时B事务也修改了表的数据,B事务在修改的数据行前加上了行级锁(X),自己产生了事务锁(TX),然后B事务也在表的级别上加了表级锁(RX)。表级锁是兼容的。当B事务打算删除整张表时,B事务不用关心表里面的数据行是否加上了行级锁,只需要知道表上有没有表级锁。B事务要删除表的话,要给表加上完全排他锁(X),RX和X是互斥的,有RX就不能有X。

 

Oracle的行级共享锁(RS):select….fromupdate。

 

Oracle的排他锁(Exclusive,简称X锁):对表结构进行改变或者删除表,这时候就要加排他锁,任何用户都不能对表进行任何修改。

 

锁的释放就是rollback和commit。

你可能感兴趣的:(oracle)