mysql锁

只是本人在日常应用的总结,提供出来,如有不对,请指出

mysql锁

1 、按照类型分

  • 读锁 (共享锁)

针对同一份数据,多个操作可以同时进行而不会相互影响,读锁可以重复添加,即多个session可对同一数据加共享锁。

  • 写锁 (排它锁)

当前写操作没有完成前,它会阻断其他写锁和读锁,此时不可以加其他锁。

2 、按照粒度分

  • 表锁

表锁 innerdb myisam 都支持,表锁的加锁 lock table 表名 read/write 解锁 unlock tables

表锁中的读锁(其他session还可以,为该表加读锁)

加锁的session  可读加锁表,不可读其他表,不可改加锁表,(当更改的时候会直接报错)。

其他session 可读加锁表,不可改加锁表(当更改的时候会需要等待)

表锁中的写锁(其他session不可以,为该表加任何锁)

加锁的session 可读加锁表,可写加锁表,不可读其他表

其他session 不可读加锁表(会阻塞,等待放行)

myisam 在执行select 前 会自动给涉及的所涉及的表加读锁,在执行增删改之前会自动给涉及的表加写锁

  • 行锁(基于事务)

行锁,只有innerdb 支持,MyISAM不支持

行锁中的读锁(其他session还可以,为该行继续加读锁),加锁方法 select ... lock in share mode

加锁的session 可以对该行进行修改,可以读写其他表和行的数据。

其他session 不可以对该行数据修改(修改需要等待),但是可以查询,查询结果是加锁之前的结果(事务的隔离性)。

行锁中的写锁(其他session不可以,为该行加任何锁),加锁方法 select ... for update

当前session 可以对该行进行修改,可以读写其他表数据。

其他session 不可以对该行数据修改(修改需要等待),但是可以查询,查询结果是加锁之前的结果(事务的隔离性)。

innerdb 在执行查的时候不会加任何锁,在执行增删改之前会自动给涉及的行加写锁,假如没有手动开启事务,那么将是
    一条sql语句就是一个事务

行锁,是根据索引进行加锁的,因此当没有使用索引,或者索引失效造成全表扫描,行锁会锁定全表。(具体例子)

1 、索引失效

 begin;
        update temp set b = 4001 where a = 4;

     数据库中 a存的是字符串类型,尽管mysql做了类型转换,但是索引失效,变成了全表扫描,这个时候 会锁住整个表,  其 他事物再更新该表的时候,会阻塞。

2 、间隙锁

update temp set b = 4001 where a > 1 and a < 4

由于上面的update将2锁住了,因此下面的插入可能会出现问题
        insert into temp values('2','2001')

3 、按照思想分

  • 乐观锁
  • 悲观锁

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值