mysql事务及存储引擎

目录

什么是事务

事务的ACIP特性

事务之间的影响

mysql隔离级别

事务隔离级别的作用范围

事务控制语句

mysql存储引擎


什么是事务

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

事务是通过事务的整体性以保证数据的一致性。

说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位,事务的存在可以确保数据操作的正确性和可靠性,保证数据在操作过程中,不会出现异常或错误 。


事务的ACIP特性

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

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

事务是一个完整的操作,事务的各元素是不可分的,事务的所有元素必须作为一个整体提交或回滚,如果有一个环节出现问题,那么整个事务将失败

一致性:   事务执行前后,数据库从一个一致状态转换到另一个状态,保证数据的完整性和准确性。

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

隔离性:   多个并发事务相互隔离,互不干扰,每个事务独立执行,避免数据混乱和不一致

持久性:   一旦事务提交,其对数据库的修改是永久性的,即使系统发生故障或重启,修改的数据也不会消失。


事务之间的影响

脏读: 

当有两个事务在访问同一个数据时,一方对数据进行了修改,但最后选择了回滚(没有写入到数据库中),但另一方事务在他回滚前读到了这个被修改的数据,这就是脏数据。也就是脏读。

不可重复读:

一个事务两次相同的查询,返回的不同的数据,这是由于其他事务修改并提交所造成的。

幻读:

一个事务1在对表内容进行修改,而且是涉及到全表的,另一个事务2此时也对此表内容进行修改,并且在事务1之前提交了。此时,事务1修改完后,发现刚刚的更改对某些数据没起作用,这是事务2刚刚插进来的数据,让操作事务1的用户感觉很魔幻,出现了幻觉,也就是幻读。

丢失更新

两个事务同时读取同一条记录  事务1先修改记录,事务2也修改记录(2不知道1修改过),2提交数据后会覆盖掉1的修改记录。但这不是意味着事务1的操作失败了,事务1成功了,只是记录被事务2的记录覆盖掉了


mysql隔离级别

read uncommitted (安全性最差,但性能好 不使用)

read uncommitted:(读取尚未提交的数据)不解决脏读,允许脏读,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

read committed  Oracle 数据库默认  安全性较差,性能较好) 

read committed:(提交读)读取已经提交的数据,可以解决脏读,只能读取已经提交的数据

repeatable read  mysql数据库默认  安全性较高,性能较差)

repeatable read:(可重复读)重复读取,可以解决脏读和不可重复读。无论其他事务是否修改并提交了数据,在这个事务内看到的数据始终不受其他事务影响

serializable  (安全性最高,性能最差  不使用)

serializable:(串行化)可以解决脏读,不可重复读,幻读。相当于锁表,完全串行化的读,每次读都需要获得表级共享锁,读写相互阻塞


事务隔离级别的作用范围

会话级:对当前的会话有效

全局级:对所有的会话有效

查询全局事务隔离级别

查询会话事务隔离级别

设置全局事务隔离级别

设置会话事务隔离级别


事务控制语句

begin 或 start transaction:显式地开启一个事务

commit 或 commit work:提交事务,并使已对数据库进行的所有修改变为永久性的

rollback 或 rollback work:回滚事务,撤销当前所有未提交的所有操作并结束事务

savepoint 回滚点名 :使用savepoint 允许在事务创建一个回滚点,一个事务可以创建多个回滚点

(回滚点只会存在当前事务中,事务结束,回滚点消失)

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

set autocommit = 0;           禁止自动提交

set autocommit=1;              开启自动提交,mysql默认1

show variables like  'autocommit'      查看mysql中的autocommit值

事务提交

事务回滚

设置回滚点

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit , 当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

如果开启了自动提交,mysql会把每个sql语句当作一个事务,然后自动的commit,当然无论开启与否,begin, commit|rollback 都是独立的事务。


mysql存储引擎

存储引擎介绍

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

mysql的常用存储引擎

Myisam

myisam不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

myisam适合查询,插入为主的应用场景

myisam在磁盘上存储成三个文件,文件名和表名相同,但是扩展名分别为:

.frm    文件存储表结构的定义

.MYD(MYData)  数据文件的扩展名

.MYI(MYIndex)  索引文件的扩展名

表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞: 串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入
特性:数据单独写入或读取,速度过程较快且占用资源相对少

MyISAM 表支持 3 种不同的存储格式:

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

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

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

myisam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景


lnnoDB

lnnodb 支持事务,读写阻塞与事务的隔离级别有关,能搞笑的缓存索引和数据,表与主键以簇的方式存储,支持分区,表空间,支持外键约束,5.5版本后支持全文索引,对硬件资源要求还是比较高的场合,采用行级锁定,但在全表扫描时仍然是表级锁定

InnoDB 中不保存表的行数,如 select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表
对于自增长的字段,InnoDB 中必须包含只有该字段的索引

但是在 MyISAM 表中可以和其他字段一起建立组合索引,清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表(truncate)
 

mysql从5.5.5版本开始,默认的存储引擎为lnnodb

查看系统支持的存储引擎

show engines;

查看表使用的存储引擎

show table status from 库名 where name='表名'\G;(命令太长,不推荐使用)

show create table 表名;

修改存储引擎

alter table 表名 engine=引擎名;

创建表时指定引擎

修改配置文件,但需要重启mysql,对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

vim /etc/my.cnf

修改此模块下的内容

[mysqld]

default-storage-engine=INNODB

systemctl restart mysqld

相关推荐

  1. MySQL索引、事务存储引擎

    2024-03-22 19:14:04       49 阅读
  2. MySQL 中的事务存储引擎

    2024-03-22 19:14:04       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 19:14:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 19:14:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 19:14:04       82 阅读
  4. Python语言-面向对象

    2024-03-22 19:14:04       91 阅读

热门阅读

  1. 每日OJ题_子数组子串dp①_力扣53. 最大子数组和

    2024-03-22 19:14:04       41 阅读
  2. 题记(57)--L1-080 乘法口诀数列

    2024-03-22 19:14:04       45 阅读
  3. 【C++通关攻略 · 基础篇】数据类型

    2024-03-22 19:14:04       44 阅读
  4. vue 若依 新开tab 不关闭旧的tab

    2024-03-22 19:14:04       43 阅读
  5. ADB/ADB shell

    2024-03-22 19:14:04       42 阅读
  6. 抽象类与抽象方法(abstract)

    2024-03-22 19:14:04       38 阅读
  7. conda下载设置为国内源

    2024-03-22 19:14:04       43 阅读
  8. 牛客小白月赛58-C-牛牛

    2024-03-22 19:14:04       40 阅读