美文网首页程序员
MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

作者: 小新是个程序媛 | 来源:发表于2018-05-14 17:35 被阅读280次

1. 行锁

给某一行记录上锁,目前只有InnoDB引擎支持行锁

2. 表锁

给一个整张表上锁

3. 乐观锁

本身很乐观,认为在操作数据时(更新操作),默认别的线程并不会操作数据发生冲突,所以在每次操作时并不会上锁,只是在更新时判断别的线程在此期间是否有做修改,如果有修改该操作就无效

通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

#1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}

#2.修改商品status为2
set status=2,version=version+1 where id=#{id} and version=#{version};

4. 悲观锁

(大多数情况下依靠数据库的锁机制实现,开销比较大)
本身很悲观,认为在操作数据时总会发生冲突,所以在每次操作时都需要给相应的数据加上锁来避免冲突,所以悲观锁比较耗时,另外与乐观锁不同悲观锁是由数据库自己实现的,所以要用的时候可以直接调用数据库的相关语句.
共享锁和排他锁是悲观锁的不同实现,但都属于悲观锁

  • 共享锁(lock in share mode)
    共享锁又称读锁,一个线程给数据加上共享锁之后,其他线程只能读数据不能修改数据
  • 排他锁(for update)
    排他锁又称写锁,跟共享锁的区别是,其他线程既不能读也不能写数据

相关文章

  • rails中乐观锁和悲观锁的使用

    MySQL乐观锁和悲观锁的介绍可以参考之前的一篇文章MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)...

  • MS汇总

    数据库相关[MS-关于锁(乐观锁,悲观锁,行锁、表锁,共享锁,排他锁)Mysql索引优化Mysql查询优化Mysq...

  • MS-关于锁(乐观锁,悲观锁,行锁、表锁,共享锁,排他锁)

    这几个锁按照属性可分为:乐观锁、悲观锁(共享锁,排他锁),行锁、表锁指的是锁粒度。 乐观锁乐观锁就是很乐观的认为,...

  • 乐观锁与悲观锁——解决并发问题

    这几个锁按照属性可分为:乐观锁、悲观锁(共享锁,排他锁),行锁、表锁指的是锁粒度。 乐观锁乐观锁就是很乐观的认为,...

  • 数据库相关问题与解答

    收集常见数据库问题 锁机制介绍:行锁、表锁、排他锁、共享锁,悲观锁、乐观锁。行级锁:开销大,加锁慢;会出现死锁;锁...

  • mysql锁

    mysql锁 性能:乐观锁,悲观锁 操作类型:读锁,写锁,都属于悲观锁 操作粒度:行锁,表锁 乐观锁:一种思想,通...

  • mysql锁记录

    mysql锁 性能:乐观锁,悲观锁 操作类型:读锁,写锁,都属于悲观锁 操作粒度:行锁,表锁 乐观锁:一种思想,通...

  • 共享 + 排他锁

    mysql锁机制分为表级锁和行级锁 ,mysql中行级锁中的共享锁与排他锁进行分享交流。 测试语法 begin; ...

  • mysql : 行锁,表锁,共享锁,排他锁,悲观锁,乐观锁

    1.表级锁与行级锁 表级锁: table-level locking,锁住整个表。 开销小,加锁快。不会死锁(一次...

  • MySQL中的锁和并发控制

    综述 对MySQL中并发控制所用到的机制和锁进行整理。 行锁 表锁 间隙锁 临键锁 MVCC 悲观锁 乐观锁 行锁...

网友评论

    本文标题:MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

    本文链接:https://www.haomeiwen.com/subject/kamnrftx.html