当
Oracle
数据库发生
TX
锁等待时,如果不及时处理常常会引起
Oracle
数据
库挂起,或导致死锁的发生,产生
ORA-60
的错误。这些现象都会对实际应
用产生极大的危害,如长时间未响应,大量事务失败等。
悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle 将会对返回集中的数据建立行级封锁,以防
止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行 dml 或 ddl 操作都会返回一
个错误信息或发生阻塞。
1:对返回结果集进行 update 或 delete 操作会发生阻塞。
2:对该表进行 ddl 操作将会报:Ora-00054:resource busy and acquire with
nowait specified.
原因分析
此时 Oracle 已经对返回的结果集上加了排它的行级锁,所有其他对这些数据
进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他
的操作将发生阻塞,这个这个操作 commit 或 rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何 ddl 操作,否
则将会报出 ora-00054 错误::resource busy and acquire with nowait
specified.
二、乐观封锁
乐观的认为数据在 select 出来到 update 进取并提交的这段时间数据不会被更
改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存
在一种可能被其他用户更改的可能。因此 Oracle 仍然建议是用悲观封锁,因
为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被
阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4 个常见的
dml 语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
评论