zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers
    Discuz!NT中集成Memcached分布式缓存
    Memcached 两款.NET客户端的郁闷事儿
    分布式缓存BeIT Memcached简介
    .NET平台上的Memcached客户端介绍(Memcached Providers)
    PhantomJs 与 Casperjs
    ES5 Object.defineProperties / Object.defineProperty 的使用
    关于每天必做、且需要立刻执行、立刻培养的事
    我最喜欢的模板jade(pug)学习和使用
    前端 使用 crypto-js 对数据进行对称加密
  • 原文地址:https://www.cnblogs.com/cloud7777/p/13172316.html
Copyright © 2011-2022 走看看