mysql的锁详解

因为mysql的数据也是一种共享资源,那么为了保证数据并发房屋的一致性有效性,那么就需要锁了。

锁分类

  • 从性能上分为乐观锁和悲观锁
    乐观锁:乐观锁一般会使用版本号机制实现

    使用版本号:数据库表会加上一个version版本号字段,表示修改次数,每次数据修改成功后,版本号都会成功加1。当线程去修改某一条记录时,先读取这条记录和version,提交时,再用刚刚读取的version和现在数据库的version进行比对。如果相等,则提交成功,更新成功。如果不相等,则会重试更新操作,直至成功。

    悲观锁:

    总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程),Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

  • 从对数据库操作的类型分,分为读锁和写锁,他们都属于悲观锁

    读锁也称共享锁,针对同一份数据,多个读操作可以同时进行而不会互相影响,读锁会阻塞写,但是不会阻塞读
    当前session和其他session都可以读该表 当前session中插入或者更新锁定的表都会报错,其他session插入或更新则会等待

    可以手动设置读锁

LOCK TABLE 表名 read;

然后去读取数据,可以读取成功
在这里插入图片描述
然后去修改数据,就会失败

在这里插入图片描述

写锁也称为排它锁,当前写操作没有完成时,会阻断其他写锁和读锁,写锁会把读和写都阻塞。

也可以手动设置写锁,当前session对该表的增删改查都没有问题,其他session对该表的所有操作被阻塞

LOCK TABLE 表名 write;
#删除锁
UNLOCK TABLES:
  • 从数据库操作的粒度分,分为表锁和行锁

    表锁每次操作会锁住整张表,开销小,加锁快,不会出现死锁,锁粒度大,并发度低,一般用在整个表数据迁移的场景。

    行锁,每次操作锁住一行数据。开销大,加锁满;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度最高。

InnoDB与MYISAM在锁的区别:

1.InnoDB支持事务
2.InnoDB支持行级锁
3.MYISAM在执行查询语句SELECT语句前,会自动给设计的所有表加读锁,在执行修改,新增,删除时,给设计的表加写锁。
4.InnoDB在执行查询语句时,因为有mvcc机制不会加锁,但是新增修改删除时会加行锁。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值