ORACLE:阻塞

本文介绍了ORACLE数据库中阻塞的概念,通过案例分析了阻塞在更新、删除和FOR UPDATE操作中的作用。当主线程更新数据并开辟新线程查询时,如果不使用阻塞,可能导致查询到旧数据。通过阻塞,可以确保查询到的数据是主线程提交后的最新状态。同时,对于同一数据的其他delete、update和for update操作也会在阻塞后等待提交,以保证数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE:阻塞

update、delete、for update都具有阻塞。
阻塞使用场景案例:
主线程执行逻辑,更新表trade_type_test,开辟新线程导出数据后,查询数据,查询的数据是主线程更新状态后的数据,而不是更新状态前的数据。
一、如果子线程查询数据,不使用阻塞,则可能会出现主线程更新数据,还没有提交,而子线程执行速度很快,已经执行到了查询这一步的情况下,导致查询出来的数据是更新状态之前的数据。
如下:
开启两个plsqldev
plsqldev(1)

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1;

         ID NAME                                                                             STATUS
----------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
          1 充值                                                                             0

SQL> UPDATE TRADE_TYPE_TEST SET STATUS = 1 WHERE ID = 1;

1 row updated

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1;

         ID NAME                                                                             STATUS
----------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
          1 充值                                                                             1

说明:更新数据,但是并未提交,在第二个plsqldev中查询出的该数据仍然status=0
plsqldev(2)

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1;

         ID NAME                                                                             STATUS
----------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
          1 充值                                                                             0

以上情况查出的数据就不正确了。
二、使用阻塞的办法解决该场景
plsqldev(2)

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1 FOR UPDATE;

以上第二个plsqldev一直处于阻塞,等待状态。直到第一个plsqldev提交后才执行该查询语句。
plsqldev(1)

SQL> commit;

Commit complete

plsqldev(1)提交后,plsqldev(2)立即查询,查询出的是更新状态后的我们所需要的数据。
plsqldev(2)

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1 FOR UPDATE;

         ID NAME                                                                             STATUS
----------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
          1 充值                                                                             1

for update也具备了阻塞,其他对该数据delete、update、for update的操作,仍然也需要等待plsqldev(2)提交后,才能执行。

SQL> SELECT * FROM TRADE_TYPE_TEST WHERE ID = 1 FOR UPDATE;

         ID NAME                                                                             STATUS
----------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
          1 充值                                                                             1

SQL> commit;

Commit complete

plsqldev(2)未提交,做delete、update、for update操作阻塞。
plsqldev(2)提交后,做delete、update、for update立即执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值