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

共享锁和排它锁

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

 

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

 

所有的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

 

死锁

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

 

转载于:https://www.cnblogs.com/MasterE/p/6617147.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值