# class2-1

[TOC]

# 深入了解锁机制的必要性

对于java程序员来说,在日常的需要使用事务的地方,可以直接使用事务注解对数据库的事务进行管理。

但一味地对一切数据库操作加事务,其中一个操作未成功,全部操作都得被回滚,这显然是非常消耗性能的。

并且,不当的数据库操作会导致频繁的死锁,消耗很多数据库性能。要解决思索或写出不导致死锁的代码,就必须对自己所使用的数据库引擎的锁机制有所了解。

# MySQL数据库锁机制实现的特征

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

# 锁分类

  • 共享锁||读锁||S 锁(share lock):其他事务可以读,但不能写。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

  • 排他锁||写锁||X 锁(exclusive) :其他事务不能读取,也不能写。允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

    类型细分:

    • 意向共享锁(IS Lock/intent share lock)
    • 意向排他锁||互斥锁(IX Lock/intent exclusive lock)
  • 悲观锁||保守锁(pessimistic locking):假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

    悲观锁是数据库层面加锁,都会阻塞去等待锁。

  • 乐观锁(optimistic locking):假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

    乐观锁是一种思想,具体实现是,表中有一个版本字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。之所以叫乐观,因为这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。

    缺点:并发很高的时候,多了很多无用的重试。乐观锁,不能解决脏读的问题。

数据库锁分类思维导图

作者:zhoulujun 链接:https://juejin.cn/post/6844903974282362887 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 1/16/2021, 9:27:12 AM