BLOCKING

The five common DML statements that willblock in the database are INSERT, UPDATE,DELETE.MERGE and SELECT FOR UPDATE.

 

The solution to a blocked SELECT FOR UPDATEis trivial: simply add the NOWAIT clause and it will no longer block. Instead,your application will report back to the end user that the row is alreadylocked.

 

INSERTS的阻塞通常发生在允许终端用户生成主键或者唯一性列值的时候,比较简单的避免这种情况发生的办法是用SEQUENCE来生成主键或者唯一性列值。如果不能使用SEQUENCE的话,可以使用手动的锁,通过DBMS_LOCK包。

 

ORACLE有无限的ROW-LEVEL locking,但是有有限的enqueue locks.

要将执行DBMS_LOCK的权限赋给用户(SCHEMA)

SQL> grant execute on dbms_lock to ops;

授权成功。

SQL> create or replace trigger demo_bifer
  2  before insert on demo
  3  for each row
  4  declare
  5     l_lock_id       number;
  6     resource_busy   exception;
  7     pragma exception_init( resource_busy,-54);
  8  begin
  9     l_lock_id :=
 10             dbms_utility.get_hash_value (to_char( :new.x),0,1024);
 11     if(dbms_lock.request
 12                             (id     => l_lock_id,
 13                             lockmode=> dbms_lock.x_mode,
 14                             timeout => 0,
 15                             release_on_commit => TRUE) <> 0 )
 16     then
 17             raise resource_busy;
 18     end if;
 19  end;
 20  /

触发器已创建

在一个session下执行
SQL> insert into demo values (1);

已创建 1 行。


换另一个session下

SQL> insert into demo values (1);
insert into demo values (1)
            *
ERROR 位于第 1 行:
ORA-00054: 资源正忙,要求指定 NOWAIT
ORA-06512: 在"OPS.DEMO_BIFER", line 14
ORA-04088: 触发器 'OPS.DEMO_BIFER' 执行过程中出错


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的blocking和non-blocking是指在读取或执行操作时的等待模式。在这种情况下,blocking指的是等待直到操作完成或满足条件,而non-blocking指的是在没有阻塞的情况下立即返回。在Android中,blocking和non-blocking模式可以应用于各种操作,包括读取数据、执行网络请求、录音等。 引用提到了在Java层传递的参数转换为布尔值blocking。在正常读取时,无论是否blocking,都会等待读取userSize之后再返回。而在读取出错时,无论是否blocking,最终也都会返回已读取的部分数据。唯一的区别在于等待时间的设置,blocking模式使用最大等待时间,而non-blocking模式使用零等待时间。 引用总结了blocking和non-blocking模式的特点。无论是否blocking,正常状态下都会读取到设置的bufferSize然后返回。在某些异常情况下,无论是否blocking,都会立即返回,例如状态错误。在出错时无论是否blocking,都会返回已读取的部分数据,可能小于设置的bufferSize。只有在状态正常但是数据未读取到时,blocking模式会进行阻塞等待,non-blocking模式会立即返回WOULD_BLOCK的错误。 引用提到了在Android的AudioRecord录音中,有两种读取模式,即blocking和non-blocking。其中,READ_BLOCKING表示读取操作将阻塞,直到请求的数据全部读取完毕。而READ_NON_BLOCKING表示读取操作将立即返回,读取尽可能多的音频数据而不进行阻塞。 综上所述,blocking和non-blocking在Android中用于控制操作的等待模式,其中blocking会等待操作完成或满足条件后返回,而non-blocking会立即返回。这些模式可以应用于各种操作,包括读取数据、执行网络请求以及录音等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [AudioRecord READ_BLOCKING 与 READ_NON_BLOCKING的区别](https://blog.csdn.net/hi_ugly/article/details/122867915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值