数据库的存储引擎和事务

news2024/11/26 2:55:56

Mysql默认使用INNODB存储引擎

数据库中的各表均被(在创建表时)指定的存储引擎来处理。

服务器可用的引擎依赖于以下因素:MySql的版本、服务器在开发时如何被配置、启动选项

为了解当前服务器中有哪些存储引擎可用,可使用show engines\g语句:

①在创建表时,可使用ENGINE选项为CREATE TABLE语句显式指定存储引擎。CREATE TABLE TABLENAME (NO INT) ENGINE = MyISAM;

②如果在创建表时没有显式指定存储引擎,则该表使用当前默认的存储引擎

③默认的存储引擎可在my.ini配置文件中使用default-storage-engine选项指定。

④现有表的存储引擎可使用ALTER TABLE语句来改变:ALTER TABLE TABLENAME ENGINE = INNODB;

⑤为确定某表所使用的存储引擎,可以使用SHOW CREATE TABLE或SHOW TABLE STATUS语句:

mysql> show create table emp\g

mysql> show table status like 'emp' \g

常用存储引擎

MyISAM存储引擎

MyISAM存储引擎是MySQL最常用的引擎。

  • 它管理的表具有以下特征:
    • 使用三个文件表示每个表:
      • 格式文件 — 存储表结构的定义(mytable.frm)
      • 数据文件 — 存储表行的内容(mytable.MYD)
      • 索引文件 — 存储表上索引(mytable.MYI)
    • 灵活的AUTO_INCREMENT字段处理
    • 可被转换为压缩、只读表来节省空间

InnoDB存储引擎

  • InnoDB存储引擎是MySQL的缺省引擎。
  • 它管理的表具有下列主要特征:
    • 每个InnoDB表在数据库目录中以.frm格式文件表示
    • InnoDB表空间tablespace被用于存储表的内容
    • 提供一组用来记录事务性活动的日志文件
    • 用COMMIT(提交)、SAVEPOINT及ROLLBACK(回滚)支持事务处理
    • 提供全ACID兼容
    • 在MySQL服务器崩溃后提供自动恢复
    • 多版本(MVCC)和行级锁定
    • 支持外键及引用的完整性,包括级联删除和更新

MEMORY存储引擎

  • 使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得MEMORY存储引擎非常快。
  • MEMORY存储引擎管理的表具有下列特征:
    • 在数据库目录内,每个表均以.frm格式的文件表示。
    • 表数据及索引被存储在内存中。
    • 表级锁机制。
    • 不能包含TEXT或BLOB字段。
  • MEMORY存储引擎以前被称为HEAP引擎。

选择合适的存储引擎

  • MyISAM表最适合于大量的数据读而少量数据更新的混合操作。MyISAM表的另一种适用情形是使用压缩的只读表。
  • 如果查询中包含较多的数据更新操作,应使用InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。
  • 可使用MEMORY存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。

事务

事务可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。事务具有四个特征ACID。

1、原子性(Atomicity)整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。

2、一致性(Consistency)在事务开始之前与结束之后,数据库都保持一致状态。

3、隔离性(Isolation) 一个事务不会影响其他事务的运行。

4、持久性(Durability) 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。

事务中存在一些概念:

  1. 事务(Transaction):一批操作(一组DML)
  2. 开启事务(Start Transaction)
  3. 回滚事务(rollback)
  4. 提交事务(commit)
  5. SET AUTOCOMMIT:禁用或启用事务的自动提交模式

当执行DML语句是其实就是开启一个事务。关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚。事务只对DML有效果。

注意:rollback,或者commit后事务就结束了。

事务的提交与回滚

1、创建表

create table user(
id int (11) primary key not null auto_increment ,
     username varchar(30),
password varchar(30)
)  ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、查询表中数据 

select * from user;

3、开启事务

start transaction;

 

 4、插入数据

insert into user (username,password) values ('zhangsan','123');

 5、查询数据

select * from user;

6、修改数据

update user set username='lili' where id = 1;

 

 

7、查看数据

select * from user;

8、回滚事务

rollback;

  

9、查看数据

select * from user;

 

 

自动提交模式

  • 自动提交模式用于决定新事务如何及何时启动。
  • 启用自动提交模式:
    • 如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。
    • 如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。
    • 如果语句执行失败,事务将自动回滚,并取消该语句的结果。
    • 在自动提交模式下,仍可使用START TRANSACTION语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。
  • 禁用自动提交模式:
    • 如果禁用自动提交,事务可以跨越多条语句。
    • 在这种情况下,事务可以用COMMIT和ROLLBACK语句来显式地提交或回滚。
  • 自动提交模式可以通过服务器变量AUTOCOMMIT来控制。
  • 例如:

        mysql> SET AUTOCOMMIT = OFF;

        mysql> SET AUTOCOMMIT = ON;

        或

        mysql> SET SESSION AUTOCOMMIT = OFF;

        mysql> SET SESSION AUTOCOMMIT = ON;

        show variables like '%auto%'; -- 查看变量状态

事务的隔离级别

隔离级别

事务的隔离级别决定了事务之间可见的级别。

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

  • 脏读取(Dirty Read)一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交,这就出现了脏读取。
  • 不可重复读(Non-repeatable Read)在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。
  • 幻像读(Phantom Read)幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。

四个隔离级别

  • InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务:
    • 读未提交(READ UMCOMMITTED)允许一个事务可以看到其他事务未提交的修改。
    • 读已提交(READ COMMITTED)允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。
    • 可重复读(REPEATABLE READ)确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。 该隔离级别为InnoDB的缺省设置。
    • 串行化(SERIALIZABLE) 【序列化】将一个事务与其他事务完全地隔离。

        例:A可以开启事物,B也可以开启事物

        A在事物中执行DML语句时,未提交

        B不以执行DML,DQL语句

隔离级别与一致性问题的关系

 设置服务器缺省隔离级别

 通过修改配置文件设置

  • 可以在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。
  • 该选项值可以是:
    • READ-UNCOMMITTED
    • READ-COMMITTED
    • REPEATABLE-READ
    • SERIALIZABLE
  • 例如:

[mysqld]

transaction-isolation = READ-COMMITTED

通过命令动态设置隔离级别

  • 隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。
  • 其语法模式为:

         SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>

         其中的<isolation-level>可以是:

    • READ UNCOMMITTED
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE
  • 例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

隔离级别的作用范围

  • 事务隔离级别的作用范围分为两种:
    • 全局级:对所有的会话有效
    • 会话级:只对当前的会话有效
  • 例如,设置会话级隔离级别为READ COMMITTED :

mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

或:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

  • 设置全局级隔离级别为READ COMMITTED :

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

查看隔离级别

  • 服务器变量tx_isolation(包括会话级和全局级两个变量)中保存着当前的会话隔离级别。
  • 为了查看当前隔离级别,可访问tx_isolation变量:
    • 查看会话级的当前隔离级别:

         mysql> SELECT @@tx_isolation;

         或:

         mysql> SELECT @@session.tx_isolation;

    • 查看全局级的当前隔离级别:

         mysql> SELECT @@global.tx_isolation;

并发事务与隔离级别示例

read uncommitted(未提交读) --脏读(Drity Read):

会话一

会话二

mysql> prompt s1>

mysql> use bjpowernode

s1>use bjpowernode

mysql> prompt s2>

s1>create table tx (

id int(11),

num int (10)

);

s1>set global transaction isolation level read uncommitted;

s1>start transaction;

s2>start transaction;

s1>insert into tx values (1,10);

s2>select * from tx;

s1>rollback;

s2>select * from tx;

read committed(已提交读)

会话一

会话二

s1> set global transaction isolation level read committed;

s1>start transaction;

s2>start transaction;

s1>insert into tx values (1,10);

s1>select * from tx;

s2>select * from tx;

s1>commit;

s2>select * from tx;

repeatable read(可重复读)

会话一

会话二

s1> set global transaction isolation level repeatable read;

s1>start transaction;

s2>start transaction;

s1>select * from tx;

s1>insert into tx values (1,10);

s2>select * from tx;

s1>commit;

s2>select * from tx;

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

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

相关文章

2022 年 项目中常用的工具函数

目录1. 数字千分位化&#xff0c;支持保留小数点2. 前端生成 uuid3. 传入日期换算出是周几4. 通过计算 text-indent 偏移的负值&#xff0c;实现文字居右隐藏, 右侧对齐 ...text5. 时间格式化函数6. 防抖和节流7. 前端文件流下载8. 后端返回 无格式化时间处理为格式化 20220101…

回收租赁商城系统功能拆解03讲-商品分类

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

【C语言进阶】指针进阶-回调函数

作者:匿名者Unit 目录一.函数指针数组1.定义2.转移表二.回调函数1.定义2.qsort的使用3.冒泡模拟实现qsort一.函数指针数组 1.定义 在之前我们已经了解过了函数指针: int(*p)(int,int)&add;我们还可以将函数的地址存放在数组&#xff0c;也就是函数指针数组 int (*p[10…

Qt音视频开发10-ffmpeg内核硬解码

一、前言 为了极大的降低CPU的占用&#xff0c;实现硬解码&#xff08;也叫硬件加速&#xff09;非常有必要&#xff0c;一个视频文件或者一路视频流还好&#xff0c;如果增加到64路视频流呢&#xff0c;如果是4K、8K这种高分辨率的视频呢&#xff0c;必须安装上硬解码才是上上…

初始Spring

初始Spring SSM框架的老大是&#xff1a;Spring大管家&#xff0c;无处不在 Spring是应用了很多优秀的设计模式,对于项目的实现,提供了优秀的解决方案;Spring是一个轻量级(低侵入) 框架.类与类之间的解耦合 IOC控制反转 实现大管家 AOP 增强&#xff0c;面向切面编程&…

QT—QPalette调色板类

Qt提供的调色板类QPalette专门用于管理部件的外观显示&#xff0c;相当于部件或对话框的调色板&#xff0c;管理他们所有的颜色信息。每个部件都包含一个QPalette对象&#xff0c;在显示时&#xff0c;按照它的QPalette对象中对各部分各状态下的颜色的描述进行绘制。示例点击左…

C语言-数据的存储-浮点数的存储(8.2)​​​​​​​

目录​​​​​​​ 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 1.2 浮点数存储规则 1.3实践举例 写在最后&#xff1a; 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 #include <stdio.h>int main() {int n 9;//以整形的形式…

SHELL脚本学习 --- 第七次作业(awk)

SHELL脚本学习 — 第七次作业 思路&#xff1a; 1&#xff0c;df -h获取磁盘情况&#xff0c;先用grep过滤出根分区所属行&#xff0c;然后awk打印相应的域 2&#xff0c;首先把多个空格缩成一个&#xff0c;然后用grep找到ens160所属的IP&#xff0c;在awk中使用正则匹配inet…

C++ STL 容器类和迭代器

一、STL容器类 1.1 STL介绍 容器就是盛放东西的东西&#xff0c;这里被盛放的一般是数据对象&#xff0c;用来盛放的是容器类容器类的内核就是&#xff1a;数据结构 算法STL(Standard Template Library,标准模板库)STL从广义上分为:容器(container)算法(algorithm)迭代器(it…

在泰国旅居的第5天,我定了两个新目标

点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接&#xff0c;进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群我在12月14号写了2023年&#xff0c;重新扬帆起航&#xff01;&#xff0c;里面说了2023年开始全球旅居办公&#xff0c;而在元旦…

历史大讲堂:这是老古董 苹果第一代Macintosh详解

还记得这个苹果吗&#xff1f;这是美国苹果公司的图标。今天我们就来借着苹果最出名的第一代个人电脑唠一唠苹果的前世今生。 这一代个人电脑 已经有鼠标了&#xff08;右下角&#xff09;&#xff0c;虽然非常的古老 macOS第一代系统就运行在这个上。这里我们也来唠一唠Macin…

Spring Boot学习笔记(十二)Spring Boot整合Quartz

一、自定义配置类 不使用springBoot的自动配置类&#xff0c;而是自定义配置类。 1、导入依赖 pom文件&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…

Android---Toolbar

目录 Toolbar Toolbar 加上 menu Toolbar 设置 Theme 完整 Demo Toolbar Toolbar 是在 Android 5.0 开始推出的一个 Materal Design 风格的导航控件 &#xff0c;Google 非常推荐大家使用 Toobar 来作为 Android 客户端的导航栏&#xff0c;以此来取代之前的 Actionbar。与 …

联想昭阳E4电脑U盘安装Win10系统操作教学

联想昭阳E4电脑U盘安装Win10系统操作教学分享。有用户想要将自己的联想昭阳E4电脑重装到Win10系统来使用。那么今天教大家一个U盘重装系统的方法&#xff0c;使用这个方法能够在系统出现问题的时候进行系统的重置&#xff0c;解决系统问题。一起来看看具体的重装教学吧。 准备工…

Exynos_4412——PWM实验

目录 一、PWM简介 1.1蜂鸣器工作原理 有源蜂鸣器 无源蜂鸣器 1.2使用GPIO控制 1.3PWM控制 1.4PWM参数 周期​ 占空比 二、Exynos_4412下的PWM控制器 三、PWM寄存器详解 四、PWM编程 一、PWM简介 1.1蜂鸣器工作原理 有源蜂鸣器 有源蜂鸣器只要接上额定电源就可以发…

主流的4种跨隔离网文件摆渡方式对比介绍

网络上承载了太多企业的业务&#xff0c;其安全性一定要得到保障&#xff0c;所以很多企业和机构都会选择将网络进行隔离划分&#xff0c;比如内外网隔离&#xff0c;办公网、研发网隔离等&#xff0c;也有不少企业会选择用云桌面的形式。 然而网络的建设就是为了互通的&#x…

【学vue跟玩一样】快速搞懂vue渲染

Vue的渲染分为条件渲染和列表渲染&#xff0c;那究竟什么式渲染呢?1.条件渲染1.v-if写法:(1)v-if"表达式"(2)v-else-if"表达式"(3)v-else"表达式"&#xff08;和我们曾经学过的JavaScript里面的if语句几乎一样&#xff09;适用于:切换频率较低的…

React umi中使用sass

umi默认支持less和css&#xff0c;如果想要使用sass&#xff0c;需要安装插件以及配置 一、安装umi的sass插件 yarn add umijs/plugin-sass 二、安装sass依赖 yarn add sass-loader node-sass 三、配置sass 在config/config.js或者 .umirc.ts文件中配置如下&#xff1a; sa…

linux 卸载elasticsearch及安装elasticsearch8.5(rpm)

目录 卸载elasticsearch rpm安装elasticsearch8.5 卸载elasticsearch # 检查elasticsearch服务状态 systemctl status elasticsearch.service; # 停止elasticsearch服务状态 systemctl stop elasticsearch.service; # 剔除elasticsearch服务 systemctl disable elasticsea…

宏任务和微任务JS执行顺序题目+总结

宏任务和微任务 resolve&#xff08;传的参数&#xff09;标记成功&#xff0c;会调用promise.then 练习网站&#xff1a; 关于promise深入理解太长没来及看 博客文章&#xff1a; promise本身是同步的&#xff0c;then/catch的回调函数是异步的 直接做题加深理解 点常见面…