oracle中的阻塞

[size=medium]1.insert产生的阻塞
如果带有主键并有唯一约束的表,两个会话同时插入一行相同的数据,这样一个会话就会阻塞,处于等待状态,知道另一个会话提交或者回滚事务,如果另一个会话提交或者回滚事务,那么阻塞会话会收到一个错误,错误提示为存在一个重复值。
解决办法:
1.1 一般都会用一个序列来生成唯一值。
1.2 如果无法使用序列,则使用手工锁来避免这一个问题,这里使用内置的DBMS_LOCK来实 现
注意:这个应用体系本身存在问题,这种方法会增加开销。而且不能轻量级实现。如果设 计良好则不会产生这个问题。千万不要对于应用每个表都使用此方法。
我们可以使用一个触发器来防止两个会话或多个会话同事插入相同的值,这个触发器使用DBMS_UTILITY.GET_ HASH_VALUE来计算主键的散列值,然后使用DBMS_LOCK.REQUEST根据这个ID分配一个排他锁(也称独占锁,exclusive lock) 。一次只有一个会话能做这个工作,所以,如果有人想用相同的主键值向表中插入一条记录,这个人的锁请求就会失败(并且会产生resource busy(资源忙)错误) :
触发器原理:触发器会把插入表的主键放到一个字符串,然后使用然后可以使DBMS_UTILITY.GET_HASH_VALUE为这个串得出一个“几乎惟一”的散列值。只要使用小于1 073 741823的散列表,就可以使用DBMS_LOCK 独占地“锁住”这个值。计算散列之后,取得这个散列值,并使用DBMS_LOCK 来请求将这个锁ID独占地锁住(超时时间为ZERO,这说明如果已经有人锁住了这个值,它会立即返回) 。如果超时或者由于某种原因失败了,将产生ORA-54 Resource Busy(资源忙)错误。


2.阻塞的Merge、Update和Delete
如果一个交互式应用,可以从数据库中查询某个数据,允许最终用户处理这个数据,再把这个数据放回数据库中,此时如果delete或update阻塞,就说明你的代码中可能存在一个丢失更新问题。就是你的代码中存在BUG。
比如你试图更新一个别人正在更新的行(有人已经锁住了这一行),可以通过select for update nowait查询可以避免这个问题。
这个查询能做到:
1.验证自从你查询数据之后数据未被修改(防止丢失更新)。
2.锁住行(防止UPDATE或 DELETE被阻塞) 。

[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值