oracle 03-09 数据并发 锁的维护与管理 alter对字段的操作方法

Managing Data Concurrency

Objectives
After completing this lesson, you should be able to:
• Describe the locking mechanism and how Oracle manages data concurrency
• Monitor and resolve locking conflicts

目标

完成本课程后,您应该能够:

•描述锁定机制以及Oracle如何管理数据并发性

•监控和解决锁定冲突

Locks
• Prevent multiple sessions from changing the same data at the same time
• Are automatically obtained at the lowest possible level for a given statement
• Do not escalate

•防止多个会话同时更改同一数据

在给定语句的最低可能水平上自动获得

•不要升级

登陆hr用户并建立t1表

SQL>alter table t1 add (col2 varchar2(50));  给t1表增加一列 col2 类型为varchar2 长度为50

SQL>update t1 set col2='lock1' where col1=10;   将col1的行col2更新为lock1

SQL>insert into t1 (col1,col2) values(20,'lock2');  插入一行 col1为20,col2为lock2

登陆sysdba用户

SQL> select * from hr.t1;  查看其他用户表的时候,要在表名前加 用户名.

COL1 COL2
---------- --------------------------------------------------
10 lock1
20 lock2

此时hr用户如果没有commit,则sysdba用户无法updatehr的col1=10 行

只有当hr

SQL>commit

之后,sysdba才能update用户hr的t1表col1=10 行

注:只有commit、rollback以及任何DDL操作(create alter drop rename truncate comment)才能使事务结束,DDL操作Oracle会隐含一个commit操作。

Enqueue Mechanism
The enqueue mechanism keeps track of:
• Sessions waiting for locks
• Requested lock mode
• Order in which sessions requested the lock

排队机制

排队机制跟踪:

•等待锁定的会话

•请求锁定模式

•会话请求锁的顺序

Possible Causes of Lock Conflicts
• Uncommitted changes
• Long-running transactions
• Unnecessarily high locking levels

锁冲突的可能原因

•未提交的变更

•长期交易

•不必要的高锁定级别  比如:开发人员用lock table 命令锁住某个表

Resolving Lock Conflicts
To resolve a lock conflict:
• Have the session holding the lock commit or roll back
• Terminate the session holding the lock (in an emergency)

解决锁冲突

要解决锁冲突,请执行以下操作:

•让会话保持锁提交或回滚

•持有锁终止会话(紧急情况下)

Resolving Lock Conflicts by Using SQL使用SQL解决锁冲突

SQL statements can be used to determine the blocking session and kill it.SQL语句可用于确定阻塞会话并终止它

SQL> SELECT sid, serial#, username

2 FROM v$session WHERE sid IN
3 (SELECT blocking_session FROM v$session);

SQL> ALTER SYSTEM KILL SESSION '144,8982' immediate;

 Deadlocks 死锁

1.sys用户update第一行,没有commit

SQL> update hr.t1 set col2='locktest' where col1=10;

2.hr用户update第二行,没有commit

SQL> update t1 set col2='locktest' where col1=20;

3.sys用户update第二行,此时需要等待

SQL> update hr.t1 set col2='lock2' where col1=20;

4.hr用户update第一行,此时变回锁死

SQL> update t1 set col2='lock1' where col1=10;

sys用户会显示锁死信息,红色的update会被自动回退

SQL> update hr.t1 set col2='lock2' where col1=20;
update hr.t1 set col2='lock2' where col1=20
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

Quiz
The lock mechanism defaults to a fine-grained, row-level locking mode.

锁机制默认为细粒度的行级锁模式。对的

When a deadlock occurs, Oracle database automatically:
a. Waits 300 seconds before terminating both sessions
b. Terminates one statement with an error in one session
c. Terminates the statements with an error in both sessions
d. Takes no action by default and leaves it to the DBA

当出现死锁时,Oracle数据库会自动:

a、 在终止两个会话之前等待300秒

b、 在一个会话中用错误终止一个语句  对的

c、 终止两个会话中都有错误的语句

d、 默认情况下不采取任何操作,交给DBA处理

Summary
In this lesson, you should have learned how to:
• Describe the locking mechanism and how Oracle manages data concurrency
• Monitor and resolve locking conflicts

摘要

在本课中,您应该学习如何:

•描述锁定机制以及Oracle如何管理数据并发性

•监控和解决锁定冲突

在数据字典中查看锁发生的情况,以及用户通道的杀除

hr用户退出SQL

SQL> select sid, serial# from v$session where username='HR';  用sys用户查看HR用户是否登陆

no rows selected  显示没有登陆

 用另一个窗口同时登陆hr

SQL> select sid, serial# from v$session where username='HR';

SID       SERIAL#
---------- ----------
17         14733      第二个窗口登陆的hr
29         12541      第一个窗口登陆的hr

然后用sys用户查看HR用户的SPID

SQL> select spid from v$process where addr in (select paddr from v$session where username='HR');

SPID
------------------------
33946
38172

SQL> host ps -ef|grep LOCAL  查看与当前用户关联的进程号
oracle 30239 30238 0 16:51 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 33946 31548 0 17:02 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 38172 35703 0 17:15 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 40773 30238 0 17:22 pts/0 00:00:00 /bin/bash -c ps -ef|grep LOCAL
oracle 40775 40773 0 17:22 pts/0 00:00:00 grep LOCAL

之后通过操作系统的进程编号对用户登陆进行杀除

Oracle 数据库中V$、GV$、X$、V_$、GV_$之间的关系说明

GV$:全局视图,针对多个实例环境。
V$:针对某个实例的视图。
X$:是GV$视图的数据来源,Oracle内部表。

SQL> desc v$lock 查看lock表结构

Name Null? Type
----------------------------------------- -------- ----------------------------
ADDR RAW(8)
KADDR RAW(8)
SID NUMBER
TYPE VARCHAR2(2)    锁的类型
ID1 NUMBER
ID2 NUMBER
LMODE NUMBER       锁的方式
REQUEST NUMBER
CTIME NUMBER
BLOCK NUMBER
CON_ID NUMBER

SQL> select type,lmode,request,id2 from v$lock where sid in (17,29);  查看锁的情况

TY LMODE REQUEST ID2
-- ---------- ---------- ----------
AE 4 0 0
AE 4 0 0

用hr用户update一行

SQL> update t1 set col2='lock2' where col1=20;

1 row updated.

SQL> select type,lmode,request,id2 from v$lock where sid in (17,29) and type in ('TX','TM');  再次查看排他所得情况 TX为排他锁 TM表一级锁

TY LMODE REQUEST ID2
-- ---------- ---------- ----------
TX 6 0 1439      防止其他用户修改表的记录
TM 3 0 0           防止其他用户修改表的结构

用户sys试图修改表的结构

SQL> alter table t1 modify (col2 varchar2(200));  用hr用户将col2的长度变更为100字节
alter table t1 modify (col2 varchar2(200))
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired  提示资源正在反面由于TM ,目的在于当hr在修改一个表的时候,防止sys修改表的结构

alter对字段的操作方法
更新字段名 alter table TABLE_NAME rename column column_old to column_new;
添加字段 alter table TABLE_NAME add (COLUMN_NAME varchar(10));
删除字段 alter table TABLE_NAME drop column COLUMN_NAME;
添加字段并附值 alter table TABLE_NAME add (COLUMN_NAME NUMBER(1) DEFAULT 1);
修改字段值 update TABLE_NAME set filedname=value where filedname=value;
修改字段数据类型 alter table TABLE_NAME modify (filedname varchar2(20));

SQL> /

TY LMODE REQUEST ID2
-- ---------- ---------- ----------
AE 4 0 0
AE 4 0 0
TX 0 6 1439  此处的0说明有锁冲突
TX 6 0 1439
TM 3 0 0
TM 3 0 0

6 rows selected.

SQL> select xidusn,xidslot,xidsqn from v$transaction;   查看事物动态视图命令

XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
7 25 1439

SQL> select type,lmode,request,id2 from v$lock where sid in (17,29) and type in ('TX','TM');

TY LMODE REQUEST ID2
-- ---------- ---------- ----------
TX 6 0 1448
TM 3 0 0

SQL> alter system kill session '17,14733' immediate;  杀掉用户进程

System altered.

杀除通道后,杀除前没有commit的update会被自动rollback

此时在用hr(进程为17,14733)的用户操作就会报错,说明该通道已被杀除。

SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 33946
Session ID: 17 Serial number: 14733

原文地址:https://www.cnblogs.com/cloud7777/p/13172316.html