如何解锁Oracle帐户

查询锁定表

选择对象名称、机器、序列号

来自gv $锁定对象l,dba _对象o,gv $会话s

其中l.object_id = o.object_id

而l . session _ id = s . sid;

2解锁

-释放会话SQL:

-更改系统终止会话' sid,serial # ';

更改系统终止会话' 23,1647 ';

3表锁定原因分析

1.更新、插入、删除数据库时,数据库无法更新,操作的等待时间不会改变。

2.程序中,底层(数据访问层)操作时,不成功,数据库连接超时,无法操作,或者操作等待时间过长。

锁的原理:比如一个操作在修改一个表,没有完成,另一个操作也在操作这个表的时候就要等待,只有在前一个操作完成之后才能进行操作。

4锁表分类以及如何避免锁表

Oracle锁表行级锁表级锁

-行被独占锁定。

-在释放锁之前,其他用户不能修改行-使用commit或rollback命令释放锁。

- Oracle通过使用INSERT、UPDATE和SELECT…FOR UPDATE语句自动获取行级锁。

SELECT…FOR UPDATE子句——在表的一行或多行上放置排他锁——用于防止其他用户更新该行。

-除了更新之外,您还可以执行其他操作。

―select * from goods where GID = 1001―更新gname

-只有当该用户提交事务时,其他用户才能更新gname。

FOR UPDATE WAIT子句——Oracle 9i中的新特性——防止行无限期等待锁定——等待间隔必须指定为数字文本。

-等待间隔不能是表达式、赋值变量或PL/SQL变量。

-select * from goods where GID = 1001更新gname wait 3-等待用户释放更新锁的时间为3秒,否则超时。?表级锁

-保护表的数据。

-保证多个用户同时访问数据时的数据完整性-可设置为三种模式:* *享受,* * *享受更新和独享。

语法:锁定表

-只允许其他用户执行查询操作-不能插入、更新和删除。

-多个用户可以同时在同一个表中放这个锁-锁表Table _ Name-共享模式[now];

rollback和commit命令释放锁nowait关键字告诉其他用户不要等待* * *来享受更新锁。

-锁定要更新的行。

-允许其他用户同时查询、插入和更新未锁定的行。

-在SELECT语句中使用“FOR UPDATE”子句可以强制使用* * *更新锁-允许多个用户同时锁定表的不同行。

两种锁定方法

在共享更新模式下锁定表tab _ nameselect column1,column 2 from goods where goods where GID = 1001

用于更新列1、列2独占锁

-与其他两种锁相比,排他锁是限制性最强的表锁-只允许其他用户查询数据。

-不允许插入、删除和更新操作。

-同一时间只允许一个用户在表上放置独占锁-* * *锁则相反。

以独占模式锁定表tab _ name锁定表格& lt表名>[& lt;表名>]...在共享模式下[无等待]

锁定表格& lt表名>[& lt;表名>]...在独占模式下[nowait]锁表& lt表名>[& lt;表名>]...在共享更新模式下[nowait]

-

锁定名称

LOCK-显式锁定事务中的表锁[TABLE]名称。

在[行|访问] {共享|独占}模式下锁定[表]名称

在共享行独占模式输入中锁定[表]名称。

名字

要锁定的现有表。

访问共享模式

注意:这种锁定模式会自动在被查询的表上生效。

这是限制最少的锁模式,它只与访问独占模式相冲突。它用于保护被查询的表不被ALTER TABLE、DROP TABLE和VACUUM并行操作同一表上的语句修改。

行共享模式

注意:任何选择...FOR UPDATE语句在执行时会自动生效。因为是* * *独占锁,以后可能会更新为行独占锁。

与独占和访问独占锁定模式冲突。

行独占模式

注意:任何UPDATE、DELETE和INSERT语句在执行时都会自动生效。

与share、share row exclusive、exclusive和ACCESS EXCLUSIVE模式冲突。

共享模式

注意:任何CREATE INDEX语句在执行时都会自动追加。* * *享受锁定整个表的乐趣。

与行独占、共享行独占、独占和访问独占模式冲突。此模式防止表被并行更新。

共享行独占模式

注意:该模式类似于独占模式,但是允许共享其他事务的行锁。

-

与ROW EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE模式冲突。

独占模式

注意:这种模式也比SHARE ROW EXCLUSIVE更具约束性。它阻塞所有并行行共享/选择...用于更新查询。

与ROW EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE模式冲突。

访问独占模式

注意:当执行ALTER TABLE、DROP TABLE和VACUUM语句时,它将自动生效。这是最严格的约束锁,它与所有其他锁模式相冲突,并保护锁定的表免受任何其他并行操作的影响。

注意:非限定锁表也需要这种锁模式(例如,没有显式锁模式选项的命令)。

输出

成功锁定后锁表返回。

错误名称:表不存在。如果该名称不存在,则返回此信息。

形容

锁表控制事务生命周期中对表的并行访问。Postgres尽可能使用约束最少的锁模式。锁表在您需要的时候提供了更多的绑定锁。

RDBMS锁定使用以下术语:

独家的

排他锁以防止其他(事务)锁。

分享

允许其他(交易)* *享受锁。避免独占锁。

接近

-

锁定表结构。

锁定独立行。

注意:如果没有声明EXCLUSIVE或SHARE,则假定它是独占的。锁存在于事务周期中。

例如,应用程序在read committed隔离级别运行事务,它需要确保在事务运行期间表中的数据存在。要实现这一点,您可以在查询之前使用共享锁模式来锁定表。这将防止数据被并行修改,并为表的任何进一步读取提供实际数据,因为共享锁模式与任何写操作所需的行独占模式冲突,并且在所有并行写操作被提交或回滚之前,不会执行SHARE MODE语句中的锁表名称。

注意:在SERIALIZABLE隔离级别运行事务,并且需要读取真实数据时,必须在执行任何DML语句之前运行一条锁表语句(此时,事务定义什么样的并行修改对自己可见)。

除了上述要求之外,如果一个事务要修改一个表中的数据,应该使用共享行排他锁模式来避免死锁(当两个并行事务试图以共享模式锁定表,然后试图更改表中的数据时,这两个事务(隐式地)都需要行排他锁模式,这与并行共享锁相冲突)。

要继续上面的死锁问题(两个事务互相等待),您应该遵循两个通用规则来避免死锁条件:

事务应该以相同的顺序请求相同对象上的锁。

例如,如果一个应用程序更新了行R1,然后又更新了行R2(在同一事务中),那么第二个应用程序如果想在以后更新行R1,就不应该更新行R2(在同一事务中)。相反,它应该按照与第一个应用程序相同的顺序更新行R1和R2。

一个事务请求两个冲突的锁模式:其中一个锁模式是自冲突的(即一次只能由一个事务持有)。如果涉及多个锁模式,事务应该总是首先请求最严格的锁模式。

在前面关于用共享行独占模式替换共享模式的讨论中,给出了这个规则的一个例子。-

注意:Postgres检测死锁,并将回滚至少一个等待的事务来解决死锁。

注意

LOCK是Postgres语言的扩展。

除了访问共享/独占锁模式,所有其他Postgres锁模式和锁表语句都与Oracle中的兼容。

锁只在事务内部使用。

使用

演示在插入外键表时,如何在带有主键的表上使用lock to SHARE:

开始工作;

以共享模式锁定桌面电影;从电影中选择id

WHERE name = '星球大战:第一集-幽灵的威胁';

-如果没有返回记录,则回滚。

插入电影_用户_评论值

(_id_,‘太好了!我等了很久了!);提交工作;

删除时与主键共享表的行排他锁:

开始工作;

以共享行独占模式锁定表片;从films_user_comments中删除其中的id(从分级& lt5);从分级为& lt5;提交工作;兼容性SQL92

SQL92中没有锁表。您可以使用SET TRANSACTION来声明当前事务的级别。我们也支持这一点。有关详细信息,请参见设置交易。