在oracle 里面,并不存在真正意义上的属于某个对象或者数据的锁,不会对某个表加锁或某几行加锁,oracle中的锁是以数据块的属性存在的,是物理的,并不是逻辑上的属于某个表或某一行的,也就是说,每个数据块本身就存储着自己数据块中的数据信息,这个地方叫ITL(Interested Transaction List),凡是在这个数据块上有活动的事务,它的信息就会记录在这里面供后续的操作查询,以保证事务一致性。
TM其实是一个段级的共享锁,通常我们叫它表锁,是因为我们把它这个表看做一个段,当某个表有几个段的时候,比如对表进行分区,每一个分区在逻辑上就是一段,如果在某个分区上insert数据时,某个分区(段)上就会加了TM锁,那么将不能在这个段上进行DDL操作。TM共享锁允许同级别(或更低级别)的锁同时设置,但拒绝高级别的锁定请求。
TX锁真正目的只是维护一个事务的完整性,更确切的说法,应该是它是一个事务锁,只要这个事务锁会在行级对数据产生影响(阻塞等),例如你在一个事务里对一个表做了1次,2次,3次,甚至更多次的update操作,这个事务所持有的TX锁一直都只有一个,所以我们经常说它是一个行级锁。
如果你的系统有主,外键引用的关系,并且满足以上三个条件中的任意一个,那么你应该考虑给从表上的外键字段创建索引,否则系统的性能可能会下降甚至阻塞:
1.主表上有频繁的删除操作。
2.主键上有频繁的修改操作。
3.业务上经常会出现主表和从表做关联的查询的情况。