如何解锁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来声明当前事务的级别。我们也支持这一点。有关详细信息,请参见设置交易。