MySQL(4)事务篇
[TOC] MySQL事务篇第13章_事务基础知识1. 数据库事务概述事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 存储引擎支持情况SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务。 能看出在 MySQL 中,只有InnoDB 是支持事务的。 1.2 基本概念事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理的原则:保证所有事务都作为 一个工作单元 来执行,即使出现了故障,都不能改变这种执行方 式。当在一个事务中执行多个操作时,要么所有的事务都被提交( commit ),那么这些修改就 永久 地保 存下来;要么数据库管理系统将 放弃 所作的所有 修改 ,整个事务回滚( rollback )到最初状态。 1234# 案例:AA用户给BB用户转账100update account set money = money - 100 where name = 'A ...
MySQL(3)索引和调优篇
[TOC] MySQL索引和调优篇第06章_索引的数据结构1. 为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全表扫描,即需要一条一条地查找记录,直到找到与条件符合的记录。 如上图所示,数据库没有索引的情况下,数据分布在硬盘不同的位置上面,读取数据时,摆臂需要前后摆动查询数据,这样操作非常消耗时间。如果数据顺序摆放,那么也需要从1到6行按顺序读取,这样就相当于进行了6次IO操作,依旧非常耗时。如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找 Col 2 = 89 这条记录,就要逐行去查找、去比较。从Col 2 = 34 开始,进行比较,发现不是,继续下一行。我们当前的表只有不到10行数据,但如果表很大的话,有上千万条数据,就意味着要做很多很多次硬盘I/0才能找到。现在要查找 Col 2 = 89 这条记录。CPU必须先去磁 ...
MySQL(2)架构篇
[TOC] 学习课程:B站搜尚硅谷MySQL康师傅 author:hah MySQL架构篇Linux下MySQL的安装与使用 具体看尚硅谷笔记高级篇《第01章 Linux下MySQL的安装与使用》 Linux版MySQL的安装和卸载 具体看尚硅谷笔记高级篇《第01章 Linux下MySQL的安装与使用》 有需要还可以设置密码的安全设置 字符集的相关操作 修改MySQL5.7字符集 在MySQL 8.0版本之前,默认字符集为 latin1 ,utf8字符集指向的是 utf8mb3 。网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改为 utf8mb4 ,从而避免上述乱码的问题。 # 操作1:查看默认使用的字符集 show variables like 'character%'; # 或者 show variables like '%char%'; 12345678- ```mysql # 修改: vim /etc/my.cnf # 加上 ...
MySQL(1)基础篇
[TOC] MySQL基础篇通用语法: 在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写,以分号结尾。 2). SQL语句可以使用空格/缩进来增强语句的可读性。 3). MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。 4). 注释: 单行注释:– 注释内容 或 # 注释内容 多行注释:/* 注释内容 */ 分类: DDL(Data DefinitionLanguage): 数据定义语言,用来定义数据库对象(数据库、表、字段) DML(Data ManipulationLanguage): 数据操作语言,用来对数据库表中的数据进行增删改 DQL(Data Query Language ): 数据查询语言,用来查询数据库中表的记录 DCL(Data Control Language): 数据控制语言,用来创建数据库用户、控制数据库的控制权限 DDL(数据定义语言)数据库操作查询所有数据库: 1SHOW DATABASES; 查询当前数据库: 1SELECT DATAB ...
JUC08- 读写锁ReentrantReadWriteLock、邮戳锁StampedLock、JUC总结
[TOC] JUC08课程任务概览本部分包含: 读写锁ReentrantReadWriteLock 邮戳锁StampedLock JUC总结 读写锁ReentrantReadWriteLock读写锁的意义和特点读写锁定义为:一个资源能够被多个读线程访问,或者被一个写线程访问,但是线程间不能同时存在读写线程。 读写互斥,读读共享,读没有完成时候其它线程写锁无法获得 它只允许读读共存,而读写和写写依然是互斥的,大多实际场景是“读/读”线程间并不存在互斥关系, 只有”读/写”线程或”写/写”线程间的操作需要互斥的。因此引入ReentrantReadWriteLock。 一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同时存在写锁和读锁(切菜还是拍蒜选一个)。 也即一个资源可以被多个读操作访问 或 一个写操作访问,但两者不能同时进行。 只有在读多写少情景之下,读写锁才具有较高的性能体现。 读写锁缺点缺点: 写锁饥饿问题 下面邮戳锁解决(StampedLock) 注意锁降 ...
JUC07-AQS(AbstractQueuedSynchronizer)及源码解读
[TOC] JUC07课程任务概览本部分包含: AQS ==AQS(AbstractQueuedSynchronizer)==AQS理论知识AQS是什么?since jdk1.5 字面意思:抽象的队列同步器 AQS字面意思时抽象队列同步器,他是用来实现锁和其它同步器组件的公共基础部分的抽象实现,是重量级基础框架和整个JUC体系的基石,解决了锁分配给谁的问题,使用CAS和volatile机制实现的锁模板,保证了代码的同步性和可见性,AQS封装了线程的阻塞等待挂起,和解锁唤醒其它线程的逻辑,它的子类只需要根据状态变量,判断是否可以获得锁,是否释放锁,使用LockSupport挂起、唤醒线程即可 锁和同步器的关系 锁,面向锁的使用者 定义了程序员和锁交互的依层APL,隐藏了实现细节,你调用即可。 同步器,面向锁的实现者 Java并发大神DougLee,提出统一规范并简化了锁的实现,将其抽象出来屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的—公共基础部分 技术解释 是用来实现锁或者 ...
JUC06-无锁、偏向锁、轻量级锁、重量级锁,synchronized锁升级
[TOC] JUC06课程任务概览本部分包含: synchronized锁升级 ==Synchronized锁升级==本章学习建议:从上往下看,发现看不懂时,找到下面最近的一个 我的理解 ,然后根据我的理解中我概括的内容,再去看上面的东西 小结和本章最后最后都会有我的理解汇总 本章路线总纲synchronized相关基础知识点和字节码分析请看 《JUC02》的多线程锁目录 【强制】高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。 说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法。 ——《阿里开发手册》 synchronized锁优化的背景 用锁能够实现数据的安全性,但是会带来性能下降。 无锁能够基于线程并行提升程序性能,但是会带来安全性下降。 所以我们要找一个平衡: 锁的升级过程: 无锁 –> 偏向锁 –> 轻量级锁 –> 重量级 ...
JUC05-ThreadLocal、ThreadLocal底层与Thead、ThreadLocalMap之间的关系、Java对象内存布局
[TOC] JUC05课程任务概览本部分包含: ThreadLocal ThreadLocal底层与Thead、ThreadLocalMap之间的关系 内存布局 ThreadLocal定义和作用是什么? ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务D)与线程关联起来。 能干嘛? 实现每一个线程都有自己专属的独立初始化的本地变量副本(自己用自己的变量不麻烦别人,不和其他人共享,人人有份,人各一份): 主要解决了让每个线程绑定自己的值,通过使用get()和set()方法,获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安全问题,比如我们之前讲解的8锁案例,资源类是使用同一部手机,多个线程抢夺同一部手机使用,假如人手一份是不是天下太平?? 我的理解: 不是前面JMM中的本地内存,前面的本地内存是共享主内存中的拷贝,这里的是每个线程独有的 ...
JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类
[TOC] JUC04课程任务概览本部分包含: CAS自旋 CAS自旋锁 ABA问题及解决办法 18大原子类 原子增强类以及它为什么快 CASCAS原理简介CAS发展:java.util.concurrent.atomic包下的类是使用CAS+自旋实现的 没有CAS之前:多线程环境不使用原子类保证线程安全++(基本数据类型) 使用synchronized或lock(都是悲观锁) 使用CAS之后:多线程环境 使用原子类保证线程安全++(基本数据类型) 类似于乐观锁,比较后不对再次尝试 1234567891011121314151617public volatile int value = 0;public int getValue(){ return value; //利用volatile保证读取操作的可见性}public synchronized void setValue(){ value++; //利用synchronized保证复合操作的原子性}//--------------CAS-------- ...
JUC03-JMM、volatile
[TOC] JUC03课程任务概览本部分包含: JMM(Java内存模型) happendss-before先行发生原则 volatile关键字 内存屏障 JMM(Java Memory Model)JMM定义和作用定义 JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。 原则: JMM的关键技术点都是围绕多线程的原子性、可见性和有序性展开的 作用 能干嘛? 1通过JMM来实现线程和主内存之间的抽象关系。 2屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。 通俗解释 电脑读写速度: CPU寄存器 > CPU缓存 > 主存 > 硬盘 > 网络 因为有这么多级的缓存(cpu和物理主内存的速度不一致的), CPU的运行并不是直接操作内存而是先把内存 ...