演示行级排他锁

Posted liu_xiya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了演示行级排他锁相关的知识,希望对你有一定的参考价值。

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语句得以执行。

 

以上是关于演示行级排他锁的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的共享锁与排他锁

转 MySQL中的共享锁与排他锁

获取数据库时间sql 以及行级锁总结-共享锁-排他锁-死锁

-mysql-锁机制分为表级锁和行级锁

[数据库事务与锁]详解六: MySQL中的共享锁与排他锁

[数据库事务与锁]详解六: MySQL中的共享锁与排他锁