Oracle踩坑记

在使用PLSQL执行带有FOR UPDATE的SQL语句并修改数据但未提交时,会导致表锁。理解Oracle中的共享锁和排他锁是关键。共享锁阻止其他事务加排他锁,而排他锁允许读取和修改数据。解决问题的方法包括正确提交事务,检查登录用户的权限,并监控v$locked_object和v$session视图。

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

问题描述:

plsql连接数据库,执行SQL语句后面带上for update,然后修改数据,未提交直接关闭plsql,导致表锁

 

前提条件:先要了解oracle中两种模式的锁排他锁(exclusive lock,即X锁)和共享锁(share lock,即S锁)。

1.共享锁:

        如果事务T对数据d加上共享锁,则其他事务只能对d再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。(注:共享锁是表级的,比如Select会对表加共享锁)

2排他锁:

        如果事务T对数据r加上排他锁,则其他事务不能再对r加任任何类型的锁。获准排他锁的事务既能读数据,又能修改数据。(注:排他锁一般是行级的,比如DML操作 insert update delete,我们在执行DML操作时分两步加锁,先加共享锁(表级),后加排他锁(行级)。在添加排他锁后,不能添加任何锁直至锁释放 commit或者rollback

分析:

通过DML语句对一张表的某一行数据进行修改,一个事务开始,其中经历的过程如下:
1.对这张表加一个共享锁。这么做是为了防止别的会话通过DDL语句修改这张表的表结构。DDL语句要修改了这张表,就必须给表加上排他锁。但是现在给表加了共享锁了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值