深入理解Oracle行锁与表锁(oracle行锁表锁)
Oracle常规行级锁与表级锁概念
Oracle进行行级锁的控制,最重要的指令是Select for Update和 Update。Select for Update语句可以查询出表中的某行并锁定該行,通常这个指令需要与Where语句一起使用。Select for Update语句是只读/写锁定(Read/Write Lock),当一个会话使用Select for Update查询某行时,将会锁定該行记录,一旦查询完毕(注意不是commit),锁定也就解除了。Update语句可以直接更新表的某条记录的数据,但也会将这行记录加上写锁定,直到事务提交后,才会被解除。
同时Oracle还在表级锁控制语句,它们是Lock Table和Share Lock。Lock Table语句是一个排他的锁定,执行Lock Table语句时,所有的查询都会被锁住,而其他会话也不能更新这个表,包括commit,一直到事务结束后,才会被解除。Share Lock语句则不会锁住查询,只锁住更新,只不过其他会话也不能更新这个表,但进行select可以正常查询表内容。
Oracle行锁与表锁优缺点
Oracle行锁由于只锁定一行,在前面提到的行级锁控制语句,主要还是Select For Update 和 Update,所以它更加灵活,可以节省大量的内存,我们可以将锁定的范围较精细,减少对整表的维护和管理,也可以对对需要保护的数据,控制更细致的范围,这样避免了一次操作的的数据,可能会影响其他用户的数据。
但是由于行锁是个体的锁,这样在多用户模式下,容易发生活锁,大量的行锁可能会降低性能,尽管有行级锁控制,可以避免很大一部分冲突,但仍然会存在一定的冲突。
而表级锁,当执行Lock Table或者Share Lock语句时,会对整个表中所有记录加锁,当一个会话的事务结束后,锁定也会被释放,但如果一个操作太多,就会导致其他会话非常耗时,因此,在实际开发和使用中,一般情况下,不推荐使用表锁。
总结
Oracle行锁提供了更精细的行锁控制,可以对对需要保护的数据,控制更细致的范围,但容易发生活锁,而表级锁可以对整张表进行锁定控制,但无论是性能还是使用上,表锁都有很多的限制,所以用户在使用Oracle中,需要根据自己的实际需求,选择行锁或表锁,才能取得最佳的控制效果。