Oracle 中的 for update

1. select … for update

只允许当前 session 对已经存在的数据进行更新,但其它 session 仍可以进行 insert 的操作

1
2
3
4
/*表示全表锁定*/
select * from Table1 for update;
/*表示行锁定,只锁定满足条件的数据*/
select * from Table1 pkid = 10 for update;

2. select … for update of ...

常用于多表操作时,仅对特定数据表进行锁定

1
2
/*表示对表1的pkid加锁*/
select * from Table1 a join Table2 b on a.pkid=b.pkid for update of a.pkid;

3. select … for update wait```与```select … for update nowait

如果不使用nowaitwait子句, 新的加锁请求会一直 hang 住, 直到原来的 commit 或 rollback,否则,当发现请求加锁资源被锁定未释放的时候,直接报错返回

1
2
3
4
/*不等待,直接报错*/
select * from Table1 for nowait;
/*如果3秒内还是无法加锁则报错*/
select * from Table1 for wait 3;

4. for update skip lock

尝试加锁之前判断记录是否已锁定,若已锁定,这跳过该记录

5. 注意

  1. 单表查询时,for updateselect … for update of ... 是一样的,多表查询时,仅锁定 of 后列所在的表