zoukankan      html  css  js  c++  java
  • 演示行级排他锁

    update 命令属于 DML语句,事务未提交/回滚时 会产生行级锁。目的是避免其它用户同时修改这个数据。

    准备工作:

    SQL> create table tt (id number);
    
    Table created.
    
    SQL> insert into tt values (1);
    
    1 row created.
    
    SQL> insert into tt values (2);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.

    窗口一:

    SQL> update tt set id=100 where id=1;
    
    1 row updated.

    窗口二:

    SQL> update tt set id=1000 where id=1;

    光标停在此处不动

    这就是行级锁。

    在sys用户下查看v$session.

    v$session 这个参数可以查看当前会话    通过blocking_session 可以看出 SID=43的会话被 SID=35的会话阻塞;

    SQL> select sid,serial#,username,blocking_session from v$session where username='HR';
    
           SID    SERIAL# USERNAME                       BLOCKING_SESSION
    ---------- ---------- ------------------------------ ----------------
            35       1655 HR
            43       6817 HR                                           35

    除了在窗口一下执行commit / rollback 外    还可以在库中执行下面命令 直接kill掉SID=35的会话

    SQL> alter system kill session '35,1655' immediate;
    
    System altered.

    窗口一

    SQL> select * from tt;
    select * from tt
           *
    ERROR at line 1:
    ORA-03135: connection lost contact
    Process ID: 19460
    Session ID: 35 Serial number: 1655

    窗口二

    QL> update tt set id=1000 where id=1;
    
    1 row updated.
    
    SQL> select * from tt;
    
            ID
    ----------
           1000
             2

    由于窗口一的会话已经断开,行级锁也就不存在。窗口二update语句得以执行。

  • 相关阅读:
    Unit of Work
    Layered Supertype
    Domain Model
    ASP.Net设计模式读书笔记
    VS2010无法使用nuget安装第三方包的问题
    数据库对象命名
    sql50题
    RESTFul API
    EasyUI日历控件
    ASP.NET MVC 防止前端点击劫持
  • 原文地址:https://www.cnblogs.com/liuxiya/p/6143044.html
Copyright © 2011-2022 走看看