数据并发会引起很多问题,在一些场合下有些问题时允许的,但在另一些场合下可能是致命的。数据库通过锁机制解决并发访问的问题,虽然不同的数据库在实现细节上存在差别,但原理基本上是一样的。
按锁定的对象的不同,一般可以分为表锁定和行锁定。前者对整张表进行锁定,而后者对表中的特定行进行锁定。从并发事务锁的关系上看,可以分为共享锁和独占锁。共享锁定会防止独占锁定,但允许其他的共享锁定。而独占锁定即防止其他的独占锁定,也防止其他的共享锁定,为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和select for update语句都会隐式采用必要的行锁定。
Oracle数据库常用的5中锁定
行共享锁定
一般通过select for update语句隐式获得行共享锁定,在Oracle中用户也可以通过lock table in row share mode 语句显示获得行共享锁定。行共享锁定并不防止顶数据进行更改操作,但是可以防止其他绘画独占性数据表锁定。允许进行多个并发的行共享和行独占锁定,还允许进行数据表的共享或者采用共享行独占锁定。
行独占锁定
通过一条insert、update或delete语句隐式获取,或者通过一条 lock table in row exclusive mode 语句显式获取。这种锁定可以防止其他会话获取一个共享锁定、共享行独占锁定或独占锁定。
表共享锁定
通过lock table in share mode语句显式获得。这种锁定可以防止其他绘画获取行独占锁定(insert、update或delete),或者防止其他表表共享行独占锁定或表独占锁定,但它允许在表中拥有多个行共享和表共享锁定。该锁定可以让会话具有对表事务级一致性访问,因为其他会话的用户提交或者回滚该事务并释放对该表的锁定之前不能更改者张被锁定的表。
表共享行独占锁定
通过lock table in share row exclusive mode语句显式获得。这种锁定可以防止其他会话获取一个表共享、行独占或者表独占锁定,但允许其他行共享锁定。这种锁定类似于表共享锁定,只是一次只能对一张表放置一个表共享独占锁定。如何A会话拥有该锁定,则B会话可以执行 select for update操作;但如果B会话试图更新选择的行,则需要进行等待。
表独占锁定
通过lock table in exclusive mode 语句显式获得。这种锁定可以防止其他会话对该表的任何其他锁定。