当前位置: 首页 > news >正文

(四十六)大白话在数据库里,哪些操作会导致在表级别加锁呢?

之前我们已经给大家讲解了数据库里的行锁的概念,其实还是比较简单,容易理解的,因为在讲解锁这个概念之前,对于多事务并发以及隔离,我们已经深入讲解过了,所以大家应该很容易在脑子里有一个多事务并发执行的概念。

在多个事务并发更新数据的时候,都是要在行级别加独占锁的,这就是行锁,独占锁都是互斥的,所以不可能发生脏写问题,一个事务提交了才会释放自己的独占锁,唤醒下一个事务执行。

如果你此时去读取别的事务在更新的数据,有两种可能:

如果你查询的时候加独占锁,那么跟其他更新数据的事务加的独占锁都是互斥的;如果你查询的时候加共享锁,那么跟其他查询加的共享锁是不互斥的,但是跟其他事务更新数据就加的独占锁是互斥的,跟其他查询加的独占锁也是互斥的。

当然一般我个人从多年研发经验而言,不是太建议在数据库粒度去通过行锁实现复杂的业务锁机制,而更加建议通过redis、zookeeper来用分布式锁实现复杂业务下的锁机制,其实更为合适一些。

为什么呢?因为如果你把分布式系统里的复杂业务的一些锁机制依托数据库查询的时候,在SQL语句里加共享锁或者独占锁,会导致这个加锁逻辑隐藏在SQL语句里,在你的Java业务系统层面其实是非常的不好维护的,所以一般是不建议这么做的。

比较正常的情况而言,其实还是多个事务并发运行更新一条数据,默认加独占锁互斥,同时其他事务读取基于mvcc机制进行快照版本读,实现事务隔离。

今天我们要给大家在讲完行锁之后,继续讲一个新的概念,就是表级锁。

在数据库里,你不光可以通过查询中的特殊语法加行锁,比如lock in share mode、for update等等,还可以通过一些方式在表级别去加锁。

有些人可能会以为当你执行增删改的时候默认加行锁,然后执行DDL语句的时候,比如alter table之类的语句,会默认在表级别加表锁。这么说也不太正确,但是也有一定的道理,因为确实你执行DDL的时候,会阻塞所有增删改操作;执行增删改的时候,会阻塞DDL操作。

但这是通过MySQL通用的元数据锁实现的,也就是Metadata Locks,但这还不是表锁的概念。因为表锁其实是InnoDB存储引擎的概念,InnoDB存储引擎提供了自己的表级锁,跟这里DDL语句用的元数据锁还不是一个概念。

只不过DDL语句和增删改操作,确实是互斥的,大家要知道这一点。

今天讲到这里,其实就是先给大家提一下表级锁的概念,同时梳理清楚DDL之类的语句是跟增删改操作互斥的,大家先理解到这个点就好

下一讲我们继续聊表级锁这个概念,说一下具体如何加锁,表级锁之间是如何互斥的。

http://www.lryc.cn/news/24271.html

相关文章:

  • 【Android源码面试宝典】MMKV从使用到原理分析(二)
  • 如何使用ADFSRelay分析和研究针对ADFS的NTLM中继攻击
  • 【Python学习笔记】第二十二节 Python XML 解析
  • 5分钟轻松拿下Java枚举
  • 华为OD机试【独家】提供C语言题解 - 最小传递延迟
  • 【Web前端】关于JS数组方法的一些理解
  • 多智能体集群协同控制笔记(1):线性无领航多智能体系统的一致性
  • hadoop-Yarn资源调度器【尚硅谷】
  • 聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
  • Flume 使用小案例
  • DLO-SLAM代码阅读
  • X和Ku波段小尺寸无线电设计
  • 推荐算法 - 汇总
  • Android 系统的启动流程
  • 自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分
  • Vue 3 第五章:reactive全家桶
  • 【联机对战】微信小程序联机游戏开发流程详解
  • 优化基于axios接口管理的骚操作
  • 【Django功能开发】如何正确使用定时任务(启动、停止)
  • 7个好用到爆的音频、配乐素材网站,BGM都在这里了
  • JUC(二)
  • ATS认证教学
  • 【操作系统】进程管理
  • 一分钟掌握技术术语:API(接口)
  • RabbitMQ之交换机
  • Tensorflow深度学习对遥感图像分类,内存不够怎么办?
  • 基础存贮模型介绍
  • JNDIExploit使用方法
  • 建议一般人不要全职做副业
  • pytorch入门6--数据分析(pandas)