首页 > 代码库 > 锁定机制和数据并发管理(笔记)

锁定机制和数据并发管理(笔记)

共享锁和排它锁

排它锁:当某一个会话正在更新某一行,为了防止其他会话修改这一行,这行会被锁定这种锁称为排他锁。被排他锁锁定的行仍然可以被其他会话读取。

 

共享锁:在一个表上放置共享锁的目的是为了防止其他会话获得这个表上的排他锁。

 

所有的DML语句都需要这两种锁:受影响记录的排它锁和表的共享锁。排它锁能够防止其他对话干预指定行,共享锁能够阻止其他会话使用DDL语句修改表的定义。

重复读取问题

看如下例子:

在某一次查询中,出现了如下结果。

SQL> select * from locktest;---操作1

COL1 COL2
---- --------------------
   1 a
   2 b

SQL> select count(1) from locktest;---操作2

  COUNT(1)
----------
         3

这是由于在执行完操作1时,另一个会话向该表中新插入了一行,且提交了。当我再执行操作2时,count=3。

解决这个问题有两种方式:

1. 给这个表上锁:

SQL> lock table locktest in exclusive mode;

Table(s) locked

此时在其他会话中更新该表时,会挂起会话。

如下是在会话2中执行的insert语句截图:

技术分享

然后在会话1中commit;(相当于对表解除锁定)会话2就成功执行了INSERT 命令:

技术分享

2. Set transaction read only;保持一致性,直到commit rollback.

SQL> select * from locktest;

COL1 COL2
---- --------------------
   1 a
   2 b
   3 c
/*这里我在会话2中插入了一条记录并提交*/
SQL> select count(1) from locktest;--仍然显示正确的结果,保证了一致性。

  COUNT(1)
----------
         3

SQL> commit;--提交

Commit complete

SQL> select * from locktest;--显示了会话2更新的表。

COL1 COL2
---- --------------------
   1 a
   2 b
   3 c
   4 d

 

死锁

除了报告死锁,什么都做不了┑( ̄Д  ̄)┍

 

锁定机制和数据并发管理(笔记)