存储过程中DBMS_LOCK.ALLOCATE_UNIQUE与RELEASE间COMMIT后锁释放时机咨询
DBMS_LOCK在COMMIT后是否会自动释放?
这个问题问到点子上了!在Oracle里,DBMS_LOCK包管理的锁有个核心特性:它和事务是完全独立的,COMMIT或者ROLLBACK操作根本不会影响这类锁的持有状态。
具体到你的场景,咱们一步步拆解:
- 当你执行步骤2的
DBMS_LOCK.ALLOCATE_UNIQUE时,分配到的是会话级锁——这个锁绑定的是当前数据库会话,而不是某个具体的事务。 - 步骤3的
COMMIT只会提交当前事务中的数据修改,对已经分配的会话级锁没有任何释放作用,锁会继续被当前会话持有。 - 直到步骤5执行
DBMS_LOCK.RELEASE,这个显式的释放操作才会把之前分配的锁彻底释放掉。
额外补充个小细节:如果是用DBMS_LOCK.REQUEST申请锁时,指定了RELEASE_ON_COMMIT参数(值为TRUE),那这类锁会在COMMIT时自动释放,但ALLOCATE_UNIQUE分配的锁默认是会话级,不存在这个参数,所以完全不受COMMIT影响。
所以结论非常清晰:锁是在步骤5之后释放的,步骤3的COMMIT不会触发锁释放。
内容的提问来源于stack exchange,提问作者fortm
相关产品推荐
相关产品推荐

