问题描述:
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语句要修改了这张表,就必须给表加上排他锁。但是现在给表加了共享锁了,