MySQL事务和引擎

news/2024/7/8 10:03:17

文章目录

  • MySQL事务
    • 事务的概念
    • 事务的ACID特点
      • 事务之间的相互影响(隔离机制)
    • 事务的隔离级别
    • 事务控制语句
      • 测试提交事务
      • 测试回滚事务
      • 测试多点回滚
  • 存储引擎
    • MyISAM
    • ISAM的特点
    • MyISAM的特点
    • MyISAM支持的存储格式
    • MyISAM适用的生产场景举例
  • Innodb
    • Innodb特点
    • 查询系统支持的存储引擎
    • 查看指定表使用的存储引擎
    • 修改存储引擎
  • 总结

MySQL事务

事务的概念

●事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
●事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
●事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
●事务通过事务的整体性以保证数据的一致性。
总结大意:
是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元

事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

事务是一个完整的操作,事务的各元素是不可分的。
事务中的所有元素必须作为一个整体提交或回滚。
如果事务中的任何元素失败,则整个事务将失败。


●一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

当事务完成时,数据必须处于一致状态。
在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。
当事务成功完成时,数据必须再次回到已知的一致状态。


●隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。


●持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

指不管系统是否发生故障,事务处理的结果都是永久的。
一旦事务被提交,事务的效果会被永久地保留在数据库中。

事务之间的相互影响(隔离机制)

(1)脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。

(2)不可重复读:一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

(3)幻读:一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

(4)丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

事务的隔离级别

(1)read uncommitted : 读取尚未提交的数据 :不解决脏读(RU)
(2)read committed:读取已经提交的数据 :可以解决脏读(RC)
(3)repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的(RR)
(4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表

事务控制语句

MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交

我们日常使用SQL语句进行操作之所以可以执行成功,是因为MySQL实现了自动提交,执行操作,而我们可以关闭这个“自动提交功能”,也就是说我们只能手动提交,而我们提交前,我们做的修改是在内存中修改的,并不会提交到磁盘,一旦提交到磁盘,那就表示对数据库中的数据进行了修改,MySQL会把我们修改的对象(表)提交一份副本到内存中,方便我们进行修改,改完之后,执行“提交”,就可以直接修改实际数据。

begin 或 start transaction 或 set autocommit = 0 (禁止自动提交):
开启一个事务

commit 或 commitwork :
提交事务,并使己对数据库进行的所有修改变成永久性的
PS:执行了commit之后才会促发I/O流进行写入

rollback 或 rollback work :
回滚会结束用户的事务,并撤销正在进行的所有未提交的修改

savepoint S1 :
使用savepoint,允许在事务中创建一个回滚点,一个事务中可以有多个savepoint:“S1”表示回滚点的名称 (多个回滚点,回到最前的点时,后面的点的数据就会丢失)

rollback to [savepoint] S1:
把事务回滚到标记点

测试提交事务

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试回滚事务

在这里插入图片描述
在这里插入图片描述

测试多点回滚

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

存储引擎

MyISAM

MySQL存储引擎是MySQL关系数据库系统,5.5版本之前默认的存储引擎,前身是ISAM。
ISAM是一个定义明确且经历时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数

ISAM的特点

ISAM执行读取操作的速度很快
不支持事务处理
不占用大量的内存和存储资源
不能够容错
使用create table 创建时,默认使用的时MyISAM存储引擎

MyISAM管理非事务表,时ISAM的扩展格式
提供ISAM里所没有的索引和字段管理的大量功能
MyISAM使用一种表格锁定的机制,以优化多个并发的读写操作
MyISAM提供高速存储和检索,以及全文搜索能力,收到web开发的青睐

MyISAM的特点

不支持事务,也不支持外键
访问速度快
对事务完整性没有要求

MyISAM在磁盘上存储成三个文件
.frm文件存储表定义
数据文件的扩展名为.MYD (MYData)
索引文件的扩展名是.MYI (MYIndex)

采用MyISAM存储引擎数据单独写入或读取,速度过程比较快且占用资源相对少

MyISAM支持的存储格式

(1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

(2)动态表
动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

(3)压缩表
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景举例

公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差

Innodb

Innodb特点

  1. 支持事务:支持4个事务隔离级别
  2. 行级锁定,但是全表扫描仍然会是表级锁定
  3. 读写阻塞与事务隔离级别相关
  4. 具有非常高效的缓存特性:能缓存索引,也能缓存数据
  5. 表与主键一簇的方式存储
  6. 支持分区、表空间,类似oracle数据库
  7. 支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
  8. 对硬件资源要求比较高的场合

innodb存储引擎的数据库在磁盘上存储成三个文件
db.opt(表属性文件)
表名.frm(表结构文件)
表名.ibd(表数据元数据)

查询系统支持的存储引擎

在这里插入图片描述

查看指定表使用的存储引擎

方法一

show table status from 库名 where name='表名'\G

在这里插入图片描述

方法二

show create table 表名;

在这里插入图片描述

修改存储引擎

方法一
通过 alter table 修改

alter table 表名 engine=MyISAM;

在这里插入图片描述
方法二

通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务

vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB

在这里插入图片描述

方法三
通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM

在这里插入图片描述

总结

事务的概念:
说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务特点的概念:
在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。

MySQL及事务隔离级别:
mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。

引擎
利用不同的方法存储数据

innodb和myisam的区别
9条区别
死锁是什么现象,怎么解决

**所谓死锁:**是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
具备条件
1)互斥条件:
2)请求和保持条件
3)不剥夺条件
4)环路等待条件

解决
采取适当措施,从系统中将已发生的死锁清除掉。
这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。


http://www.niftyadmin.cn/n/3652529.html

相关文章

[转]apache的一些必要的mod安装

Apache 的一些必要的 mod 安装 PS: Apache强大指出在于方便的插件和模块技术,这里安装的是部分不常用但是很不错的模块,包括:防范拒绝服务器攻击的mod_evasive,用于防注入等安全性防范的mod_security,以及对网页进行压…

MySQL的日志备份

文章目录日志(在备份恢复中,起到重要的作用)日志的种类查询日志服务备份的概述造成数据丢失的原因备份的类型从物理和逻辑的角度从数据库的备份策略角度,备份可分为备份方法1、物理冷备份2、专用备份工具mysqldump 或 mysqlhotcop…

[原创]MySQL中SQL优化和架构设计的一些简单想法

MySQL中SQL优化和架构设计的一些简单想法作者:heiyeluren博客:http://blog.csdn.net/heiyeshuwu时间:2006-10-14普通MySQL运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候&#xf…

c语言指针进阶(一)

大家好,我是c语言boom成家宝。今天为大家分享的是c语言中很重要的一个知识点------指针的深入讲解。 目录 指针 指针数组 数组指针 函数指针 什么是指针? 首先,指针的本质是一个地址,指针在32位机器上的大小是4个字节&a…

高阶SQL语句(排序,分组,限制,别名,通配符,子查询,视图,null值)

文章目录准备工作MySQL高阶语句常用查询按关键字排序1、单字段排序2、多字段排序3、或/且(or/and)4、查询不重复记录对结果进行分组限制结果条目设置别名AS作为连接语句通配符子查询定义、示例in的用法2、子查询-别名as子查询-exists视图示例&#xff08…

高阶SQL语句2(正则表达式,运算符,比较运算,逻辑运算符,位运算,连接查询)

文章目录正则表达式regexp 操作符所支持的匹配模式如下&#xff1a;运算符算术运算比较运算符常用比较运算符&#xff08;比较对象&#xff1a;数字&#xff0c;字符&#xff09;等于 &#xff08;&#xff09;不等于&#xff08;!或<>&#xff09;大于&#xff0c;小于两…

[转]ASCII 代码表(0-255)

ASCII 代码表II Ascii 代码表 Ascii 0 {Nulo, Sem Som} Ascii 1 Ascii 2 Ascii 3 Ascii 4 Ascii 5 Ascii 6 Ascii 7 Ascii 8 {BackSpace} Ascii 9 {Tab} Ascii 10 Ascii 11 Ascii 12 Ascii 13 {Enter} Ascii 14 Ascii 15 Ascii 16 {Shift} Ascii 17 {CTRL} Ascii 18 {ALT} Asci…

[转]Sqlite中文排序研究

Sqlite中文排序研究转载时请注明出处&#xff1a;http://blog.csdn.net/absurdSqlite是一个用C语言实现的小型SQL数据库引擎。它体积小巧但功能强大&#xff0c;对硬件资源要求很低而且性能表现卓越&#xff0c;非常适合于嵌入式应用环境。最近发现sqlite并不支持中文(拼音/笔画…