存储引擎和数据库锁

一.存储引擎

1.MySQL体系结构

  • 数据库存储引擎是数据库最核心的部分,不同的存储引擎提供不同的存储机制、索引技巧等。也就是说不同的存储引擎底层对数据的组织方式不一样,从而导致性能和特点也不一样。

2.MySQL 当中常用的存储引擎:

  1. InnoDB : 支持事务, MySQL5.5版本之后, 默认的存储引擎
  2. MyISAM : 不支持事务
  3. Memory : 速度快,最不安全。小量快速访问的数据

在这里插入图片描述

3.存储引擎的操作

-- 1. 创建数据库 db10 如果不存在则创建
CREATE DATABASE IF NOT EXISTS db10;USE db10;-- 2. 创建数据表的时候,指定存储引擎 MYISAM
CREATE  TABLE  engine_test (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
)ENGINE = MYISAM ;-- 3. 查询存储引擎
SHOW  TABLE  STATUS  FROM  db10;-- 4. 修改数据表当中的存储引擎
ALTER  TABLE  engine_test  ENGINE = InnoDB;-- 5. 查询存储引擎
SHOW  TABLE  STATUS  FROM  db10;

4.存储引擎的选择

MyISAM

特点:不支持事务和外键操作。读取速度快,节约资源。

使用场景:以查询操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高!

InnoDB

特点:MySQL 的默认存储引擎,支持事务和外键操作。

使用场景:对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作!

MEMORY

特点:将所有数据保存在内存中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问。

使用场景:通常用于更新不太频繁的小表,用来快速得到访问的结果!

总结:针对不同的需求场景,来选择最适合的存储引擎即可!如果不确定、则使用数据库默认的存储引擎!

二.数据库锁

1.锁的介绍和作用

  • 概念:数据库为了保证数据的一致性,在共享的资源被并发访问时变得安全所设计的一种规则。
  • 作用:锁机制类似多线程中的同步,作用就是可以保证数据的一致性和安全性

2.锁的分类

按操作分类

共享锁:也叫读锁。针对同一份数据,多个事务读取操作可以同时加锁而不互相影响 ,但是不能修改数据。

排他锁:也叫写锁。当前的操作没有完成前,会阻断其他操作的读取和写入。

按粒度分类

表级锁:会锁定整个表。开销小,加锁快。锁定力度大,发生锁冲突概率高,并发度低。不会出现死锁情况。

行级锁:会锁定当前行。开销大,加锁慢。锁定粒度小,发生锁冲突概率低,并发度高。会出现死锁情况。

按使用方式分类

悲观锁:每次查询数据时都认为别人会修改,很悲观,所以查询时加锁[InnoDB 中的共享锁、排他锁、表级锁、行级锁都是悲观锁]。

乐观锁:每次查询数据时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间别人有没有去更新这个数据。

不同存储引擎支持的锁

在这里插入图片描述

2.锁的语法

【注:所有锁的操作需要要在两个新连接中操作【如两台电脑,获取一台电脑连接数据库两次】,不是一个连接中的两个查询窗口】
<1>InnoDB 共享锁
共享锁说明: 数据可以被多个事务查询(DQL), 但是不能修改(DML)
也称读锁

-- 使用数据库
USE db8;-- 开启事务
START TRANSACTION;-- 查询id为1数据,(普通查询没问题)
SELECT * FROM student WHERE id=1;-- 查询id为1数据,也加入共享锁(共享锁和共享锁是兼容)
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;-- 修改id为1数据,姓名改成张三三(修改失败。会出现锁的情况。只有窗口1提交事务后才能修改成功)
UPDATE student SET NAME='张三三' WHERE id=1;-- 修改id为2数据,姓名改成李四四(修改成功,InnoDB引擎默认加的是行锁)
UPDATE student SET NAME='李四四' WHERE id=2;-- 修改id为3数据,姓名改成王五五(修改失败,InnoDB引擎如果不采用带索引的列加锁,加的就是表锁)
UPDATE student SET NAME='王五五' WHERE id=3;-- 提交事务
COMMIT;

InnoDB 共享锁与行锁和表锁

-- 使用数据库
USE db8;-- 开启事务
START TRANSACTION;-- 查询id为1数据,并加入共享锁,给索引列加的默认是行锁
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;-- 查询分数为99的数据,并加入共享锁,给非索引列加的就是表锁
SELECT * FROM student WHERE score=99 LOCK IN SHARE MODE;-- 提交事务
COMMIT;

结论:
1、多个事务中可以对某行数据同时加共享锁,因为共享锁和共享锁兼容。
2、InnoDB引擎默认加的是行锁,所以某一行如果被加锁之后就不能进行修改,但是可以修改其他行数据。
3、InnoDB引擎如果不采用带索引的列加锁,加的就是表锁,那么表中的所有数据都不能被修改。

<2>InnoDB 排他锁演示
排他锁说明: 加锁的数据, 不可以被其他事务加锁查询,可以被普通查询,不支持 增删改。
也称写锁

-- 使用数据库
USE db8;-- 开启事务
START TRANSACTION;-- 查询id为1数据(普通查询没问题)
SELECT * FROM student WHERE id=1;-- 查询id为1数据,并加入共享锁(排他锁和共享锁是不兼容的)
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;-- 查询id为1数据,并加入排他锁(排他锁和排他锁是不兼容的)
SELECT * FROM student WHERE id=1 FOR UPDATE;-- 修改id为1数据,将姓名改成张三(修改失败,会出现锁的情况。只有窗口1提交事务后才能修改成功)
UPDATE student SET NAME='张三' WHERE id=1;-- 提交事务
COMMIT;

结论:
1、如果某个事务中对某行数据加了排他锁,那么在其他事务中就不能对这行数据加任意锁查询,但是可以不加锁查询。
2、如果在某个事务某行被加了排他锁,在其他事务中同样不能修改该行数据。

<3>MyISAM写锁演示
写锁说明: 其他连接不能 查询 和 修改 数据

LOCK  TABLE  表名称  WRITE;   	-- 加锁
UNLOCK  TABLES;				  -- 解锁(将当前会话所有的表,进行解锁)
-- 使用数据库
USE db9;-- 为product表添加写锁
LOCK TABLE product WRITE;-- 查询
SELECT * FROM product;-- 修改
UPDATE product SET price=1999 WHERE id=2;-- 解锁
UNLOCK TABLES;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因修改/etc/sudoers权限导致sudo和su不能使用的解决方法

【1】问题描述 [pacosonlocalhost ~]$ sudo sudo&#xff1a;/etc/sudoers 属于组 ID 180301&#xff0c;应为 0 sudo&#xff1a;没有找到有效的 sudoers 资源&#xff0c;退出 sudo&#xff1a;无法初始化策略插件【2】解决方法 遇见这种问题应该检查sudo文件拥有者名称 ---x…

一张图搞清楚Java异常机制

转载自 一张图搞清楚Java异常机制 下面是Java异常类的组织结构&#xff0c;红色区域的异常类表示是程序需要显示捕捉或者抛出的。 Throwable Throwable是Java异常的顶级类&#xff0c;所有的异常都继承于这个类。 Error&#xff0c;Exception是异常类的两个大分类。 Error Erro…

索引---B+Tree

1.索引的介绍 MySQL 索引&#xff1a;是帮助 MySQL 高效获取数据的一种数据结构。所以&#xff0c;索引的本质就是数据结构&#xff01;在表数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式指向数据&#xff0c; 这样就…

nginx应用领域分类+事件模型

【1】nginx应用领域分类&#xff1a; 类1&#xff1a;nginx反向代理与负载均衡类网站应用&#xff1b; 类2&#xff1a;nginx php/jsp 类网站应用&#xff1b; 类3&#xff1a;nginx静态内容web服务器应用&#xff1b; 【2】F5 指的是 BIG-IP 硬件 四/七层负载均衡交换机&a…

接口限流算法:漏桶算法amp;令牌桶算法

转载自 接口限流算法&#xff1a;漏桶算法&令牌桶算法背景 每一个对外提供的API接口都是需要做流量控制的&#xff0c;不然会导致系统直接崩溃。很简单的例子&#xff0c;和保险丝的原理一样&#xff0c;如果用电符合超载就会烧断保险丝断掉电源以达到保护的作用。API限流的…

索引失效的场景(面试)

1.where条件中有or关键字 -- 创建组合索引 CREATE INDEX idx_name ON student(NAME,age); -- 查询 SELECT COUNT(*) FROM student WHERE NAMEjack666; -- 命中索引 SELECT COUNT(*) FROM student WHERE NAMEjack666 and age666; -- 命中索引 SELECT COUNT(*) FROM student WH…

nginx负载均衡与反向代理

【1】负载均衡 1&#xff09;问题&#xff1a;如何在多个网络设备或服务器之间实现合理的业务量分配&#xff0c;使之不会出现一台设备过忙&#xff0c;而其他设备却没有充分使用的情况。2&#xff09;解决方法&#xff1a;要解决这一问题&#xff0c;可以采用负载均衡的方法&a…

JDBC入门案例及相关API概述

1 JDBC概念 问题&#xff1a;JDBC的本质是什么&#xff0c;解决了什么问题&#xff1f; 2.API讲解 <1> DriverManager的作用 问题&#xff1a;DriverManager有什么作用&#xff1f; 作用一&#xff1a;注册驱动 DriverManager.registerDriver(new Driver())&#…

Spring Boot国际化支持

转载自 Spring Boot国际化支持本章将讲解如何在Spring Boot和Thymeleaf中做页面模板国际化的支持&#xff0c;根据系统语言环境或者session中的语言来自动读取不同环境中的文字。 国际化自动配置 Spring Boot中已经对国际化这一块做了自动配置。 国际化自动配置类&#xff1a;o…

http响应状态码列表

1&#xff09;响应状态码用于表示服务器对请求的各种不同处理结果和状态&#xff1b; 2&#xff09;响应状态码分为5类&#xff1a;类1&#xff09;100~199&#xff1a;表示成功接收请求&#xff0c;要求客户端继续提交下一次请求才能完成整个处理过程&#xff1b;类2&#xff…

Spring Boot整合Thymeleaf模板引擎

转载自 Spring Boot整合Thymeleaf模板引擎什么是Thymeleaf Thymeleaf是一款用于渲染XML、XHTML、HTML5内容的模板引擎。类似Velocity&#xff0c;FreeMaker模板引擎&#xff0c;它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。 Thymeleaf也是Spring Boot首…

JDBC的SQL注入漏洞

1.概念&#xff1a; 利用sql语句的漏洞来对系统进行攻击&#xff0c;导致数据泄露 2.案例演示 数据库登录表&#xff1a; 模拟登录代码【输入正确的用户名和密码才能打印出用户信息】 public class SQL注入 {public static void main(String[] args) {login( " or 1…

JVM运行时区域详解

转载自 JVM运行时区域详解我们知道的JVM内存区域有&#xff1a;堆和栈&#xff0c;这是一种泛的分法&#xff0c;也是按运行时区域的一种分法&#xff0c;堆是所有线程共享的一块区域&#xff0c;而栈是线程隔离的&#xff0c;每个线程互不共享。 线程不共享区域 每个线程的数据…

JDBC事务管理

1 事务概念 一组SQL操作要么同时成功要么同时失败。 2 JDBC事务操作的API 管理事务的功能类:Connection conn.setAutoCommit(false); //设置自动提交为false就表示开启事务 conn.commit(); //提交事务 conn.rollback();//回滚事务3.代码举例 需求&#xff1a;批量添加员工…

吃透这套架构演化图,从零搭建Web网站也不难

转载自 吃透这套架构演化图&#xff0c;从零搭建Web网站也不难 前言工作也有几多年了&#xff0c;无论是身边遇到的还是耳间闻到的&#xff0c;多多少少也积攒了自己的一些经验和思考&#xff0c;当然&#xff0c;博主并没有太多接触高大上的分布式架构实践&#xff0c;相对比较…

书写JDBC工具类

1 将哪些操作抽取到工具类中 为什么要抽取工具类&#xff1f; 我们在执行CRUD的过程中&#xff0c;有太多的重复代码需要写&#xff0c;例如&#xff1a;注册驱动、获取连接、释放资源【可以优化dao层的代码】 1 加载properties配置文件&#xff0c;获取连接数据库的相关参数&…

完整的MIME类型列表

转自&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types 这是一份比较全面的MIME类型列表&#xff0c;关联了文档的类别&#xff0c;以它们常见的扩展名排序。两种主要的MIME类型在默认类型中扮演了重要的…

大众点评Java开发实时应用监控平台-CAT

转载自 【推荐】大众点评Java开发实时应用监控平台-CATCAT介绍 CAT是基于Java开发的实时应用监控平台&#xff0c;包括实时应用监控&#xff0c;业务监控。 CAT作为大众点评网基础监控组件&#xff0c;它已经在中间件框架&#xff08;MVC框架&#xff0c;RPC框架&#xff0c;数…

第三方连接池

1 连接池的概念和作用 问题&#xff1a;连接池的本质是什么&#xff1f;有什么作用&#xff1f; 概念&#xff1a;连接池的本质就是一个容器&#xff0c;该容器中会初始化一些Connection对象&#xff0c;我们程序只需要从连接池中获取连接&#xff0c;使用完毕之后归还连接即…

think-in-java(9)接口

【9】接口 【9.1】抽象类和抽象方法1&#xff09;抽象方法&#xff1a;仅有方法声明而没有方法体&#xff1b;由abstract 修饰的方法&#xff1b;2&#xff09;抽象类&#xff1a;如果一个类包含一个或多个抽象方法&#xff0c; 则该类声明为抽象类&#xff0c;由 abstract修饰…