分布式锁本文整理自黑马程序员相关资料问题的引入在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器保证了同一时刻只有一个线程获取到锁。但是如果开启了多个服务,就会有多个JVM,从而有多个不同的锁监视器,每个锁监视器监视自己JVM内部的线程,因此一个JVM内部的线程获取到锁,并不影响其他JVM内部的线程获取锁。从而导致并发安全问题。因此,我们需要独立于JVM之外的锁监视器对所有的线程统一管理。概念满足分布式系统或集群模式下多进程可见并且互斥的锁。常见分布式锁的实现比较MySQLRedisZookeeper互斥利用Mysq
分布式锁本文整理自黑马程序员相关资料问题的引入在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器保证了同一时刻只有一个线程获取到锁。但是如果开启了多个服务,就会有多个JVM,从而有多个不同的锁监视器,每个锁监视器监视自己JVM内部的线程,因此一个JVM内部的线程获取到锁,并不影响其他JVM内部的线程获取锁。从而导致并发安全问题。因此,我们需要独立于JVM之外的锁监视器对所有的线程统一管理。概念满足分布式系统或集群模式下多进程可见并且互斥的锁。常见分布式锁的实现比较MySQLRedisZookeeper互斥利用Mysq
一.概述我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、胀读和不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。二.事务及其ACID属性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,
一.概述我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、胀读和不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。二.事务及其ACID属性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,
本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。 本篇主要内容如下: 一、本地锁的问题 首先我们来回顾下本地锁的问题: 目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。 这是一种本地加锁的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不受服务A的锁限制,并发去更新缓存ke
本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。 本篇主要内容如下: 一、本地锁的问题 首先我们来回顾下本地锁的问题: 目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。 这是一种本地加锁的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不受服务A的锁限制,并发去更新缓存ke
ReentrantLock介绍【1】ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。【2】相对于synchronized,ReentrantLock具备如下特点:1)可中断2)可以设置超时时间3)可以设置为公平锁4)支持多个条件变量5)与synchronized一样,都支持可重入 ReentrantLock问题分析【1】ReentrantLock公平锁和非公平锁的性能谁更高? 1)那肯定是非公平锁,但是为什么是非公平更高呢? 2)因为涉及到了线程的park()与unpa
ReentrantLock介绍【1】ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。【2】相对于synchronized,ReentrantLock具备如下特点:1)可中断2)可以设置超时时间3)可以设置为公平锁4)支持多个条件变量5)与synchronized一样,都支持可重入 ReentrantLock问题分析【1】ReentrantLock公平锁和非公平锁的性能谁更高? 1)那肯定是非公平锁,但是为什么是非公平更高呢? 2)因为涉及到了线程的park()与unpa
MySQL锁的粒度分为:行级锁、表级锁、页级锁。一、行级锁(INNODB引擎)行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。RecordLock,记录锁,也就是仅仅把一条记录锁上;GapLock,间隙锁,锁定一个范围,但是不包含记录本身;Next-KeyLock:RecordLock+GapLock的组合,锁定一个范围,并且锁定记录本身。二、表级锁(MYISAM引擎)表级锁是mysql中锁
MySQL为什么RR隔离级别添加了间隙锁还是无法解决幻读问题?什么是幻读?幻读本质上也属于不可重复读的情况,T1读取某个范围的数据,T2在这个范围内插入或者删除新的数据,T1再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。我的理解我的理解是:间隙锁只能保证范围内的键不被插入,无法保证范围内的键不被删除。如果在事务执行期间另一个事务删除了该范围内的某一行数据,原事务再次查询时就会发现出现了幻读。比如索引1,3有数据,然后加了间隙锁,那么查询1-3之间的数据的时候,会查询到两条记录。并且因为间隙锁的存在,所以无法添加数据。但是索引1或者3本身所代表的数据可能会被删除,所以再次查询的