第7章 锁

事务在并发中执行出现的现象

  • 读-读
    不管有有多少个事务同时读,都不会出现问题
  • 写-写
    并发事务相继对相同的记录进行改动
    解决这个,就是加锁,其他事务就不能操作了
  • 读-写或者写-读
    也就是一个事务进行读取操作,另一个事务进行改动操作
    解决这个问题有两种方案:
    1.读操作使用多版本并发控制,写操作进行加锁
    2.写操作都采用加锁

  • 共享锁
    在事务要读取已条记录时,需要先获取这些记录的S锁

  • 独占锁
    在事务要改动一条记录时,需要先获取该记录的X锁

  • 行级锁
    行锁一定是作用在索引上的,对一行数据进行锁定
    1.记录锁
    仅仅给一条记录加锁

    2.间隙锁
    是对记录范围区间加锁,就是为了解决幻读

    3.next-key lock
    间隙锁+记录锁
    4.意向锁
    当事务A想获取某个表的表锁的时候,需要对该表下的每一行记录进行遍历,查看是否有其他事务进行了锁的获取,如果存在排它锁,则需要等待其他事务释放所有锁才能后的表锁。其中的遍历成本大,需要一个更好的方法避免这种问题。

加锁

  • 间隙锁示例
-- 使用SELECT ... FOR UPDATE语句获取间隙锁
START TRANSACTION;
SELECT * FROM `student` WHERE id >= 10 AND id <= 20 FOR UPDATE;
-- 这里进行需要对students表中指定范围的记录进行修改或删除等操作
COMMIT;
  • 死锁示例
-- 事务1
begin;
-- SQL1更新id为1的
update user set age = 1 where id = 1;
-- SQL2更新id为2的
update user set age = 2 where id = 2;
commit;
-- 事务2
begin;
-- SQL1更新id为2的
update user set age = 3 where id = 2;
-- SQL2更新id为1的
update user set age = 4 where id = 1;
commit;
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫果冻

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值