56 阻塞:
这一段没有看得太明白。但是也不是云里雾里,只是了解了大概。常用的DML语句,都会造成阻塞的效果。Insert,update,delete,Merge还有select for update.
其中,最麻烦的就是Insert。因为其余的都可以锁住行,而Insert要达到阻塞的效果。必须要使用触发器。
而select for update nowait作用为由两个作用
1.验证你的数据查询之后是否会改变。
2 锁住行,
关于这一点,不是很明白。主要是不太明白何为真正意义上的阻塞?停止,还是其他。而这些语句,在实际的过程中又有什么意义?
57 死锁
其实并发问题都会产生这个问题。
这一段真的是看得云里雾里了。懂的只有概念。这里的论述让我觉得很不明了。
首先,书中大多数的部分都是在说Oracle不需要太多的死锁。并且归纳为头号原因是外键未加索引。所以建议要加索引。
满足以下条件,那么外键不加索引
1.没有从父表删除行
2.没有更新父表的为一件/主键
3.没有从从父表联接子表
让我不太明白的是,这里是介绍死锁呢?还是介绍头号原因。
58.Oracle中的锁。
其实,我以前对于锁有着自己的误解。怎么说呢。锁在我心目中是一种控制器,而不是一种手段。需要我们人为的参与。但是实际情况却并非如此。锁从某种意义上来说。只是一种数据的控制手段。我说的有点迷糊。
何为控制器。控制器在这里。我给其的定义在于我们对其招之即来呼之即去的东西。何为手段手段?就是为了达到目的而用的方法。
锁的存在,其更本的目的在于使得数据能够达到一致性。所以其只是手段。大部分由数据库控制,而不是我们。
首先,在其他数据库中,锁是一种很消耗资源的操作。但是在Oracle中则不然。因为Oracle中。把锁变成了数据的属性。具体会在第九章进行介绍。书中估计就介绍了INITRANS和MAXTRANS两个属性。
59.DML锁
Tx锁(事务锁):事物发起第一个修改的时候,就会得到一个TX锁。知道事物提交或者回滚。
TM锁(DML Enqueue)。用于修改表的内容时,表的结构不会改变的锁。
书中介绍了一个方法。两句Sql语句。分别从V$TRANSACTION, V$SESSION,V$Lock表总查看锁的情况。具体可以在P209页看到。从这里可以查出一下细节信息。
60 DDL锁
这是一个排他的DDL操作。3中类型
排他DDL锁: 能看数据,但是不能修改
共享DDL锁, 能看数据,能修改数据
可中断解析锁: 这个锁我也不太明白什么意思。对其的理解是,如果你一个查询A对其他对象有依赖。那么你依赖的对象B会有这个锁。这个锁不能先知你所依赖的对象B修改。但是如果对象B修改。那么你的缓存数据会被刷新。
关于这个。你可以使用DBA_DDL_LOCKS这个书体。但是这个视图并非默认安装。书中的例子看得似懂非懂。只有一个大概的影响。但是具体有什么用。真没看懂。
61 LATCH闩
。其实闩在书中只讲明了其运行机制,但是具体是什么。只是说了是一个轻量级的串行化设备。后来网上查询了一些资料。发觉还是不要把闩当成锁的好。因为它根本不是锁。尽管它做的是锁的事情。但是完全和锁不同。
首先闩只运行于内存中。而不运行于其他地方。其实,其获得机制与锁完全不同。锁是申请的。而闩是一种随机的获得。感觉就好象获得CPU一样。一个事务可能获得闩。但是只能保持很少时间。同时,如果多个事务同时获得竞争闩,获得会是随机的。
所以在这里提出了一个“自旋”的观念。其实看明白之后,就是如果一个事务获得不了闩。它不会后退,不会做任何操作。而是试图再次获得。就是没有wait或者sleep。
关于其他的。说句实话。我真的看懂到底什么是闩。只知道它提供一种类似于锁的机制。然后,如果想要节省资源。最好用绑定变量。Java中就是使用prepared statment。书中写了很多介绍。但是我就直接写了结果。嘿嘿。