1.什么存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧,锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。(存储引擎说白了,就像模板,每个模板有自己的主要功能,数据库管理系统在此模板上建立,MySQL5.5之后的默认是InnoDB)
2.什么事务
- 在MySQL中的事务是由存储引擎实现的,在MySQL,只有InnoDB存储引擎才支持事务。
- 事务处理可以维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
- 事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。
2.1 MySQL事务的基本操作
Mysql事务是自己执行的,执行一条语句就开启一次关闭一次
案列:
create database if not exists mydb02_transcation;
use mydb02_transcation;
-- 创建账户表
create table account(
id int primary key,
name varchar(20),
money double
);
-- 插入数据
insert into account values(1,'zhangsan',1000);
insert into account values(2,'lisi',1000);
-- 设置MySQL的事务为手动提交(关闭自动提交)
set autocommit = 0;
-- 模拟账户转账
-- 开始事务
begin;
update account set money = money - 200 where name ='zhangsan';
update account set money = money + 200 where name = 'lisi';
-- 提交事务
commit; -- 执行完这个语句,才会查询出来
-- 回滚事务
rollback; -- 如果执行代码中有错误,将之前执行语句回滚回去,数据变回原样
2.2 MySQL事务的特性
原子性、一致性、隔离性、持久性
2.3 MySQL事务的隔离级别
顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?
答: 如当一个事务正在操作的数据被另一个事务修改或删除了,最后的执行效果可能无法达到预期?
四种会出现的级别:
脏读:就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例如:(事务A修改未提交,事务B查看,随后A回归,B提交再查看,数据不一样)
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。
随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读
不可重复读:
是指在A事务内,多次读同一数据。在A事务还没有结束时,另外一个B事务也访问该同一数据。那么,在A事务中的两次读数据之间,由于B事务的修改,那么A事务两次读到的的数据可能是不一样的。这样就发生了A事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如:(查询 修改 查询)
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,事务B把张三的工资改为8000,并提交了事务。
随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
幻读:
是指当事务不是独立执行时发生的一种现象,例如A事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,B事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作B事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如:(一个修改,一个插入)
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
操作:
3. 什么是MySQL的锁机制
锁是计算机协调多个进程或线程并发访问某一个资源的机制(避免争抢);
从对数据操作的粒度分:
1)表锁:操作时,会锁定整个表
1)行锁:操作时,会锁定当前操作行
从对数据操作的类型分:
1)读锁:针对同一份数据,多个读操作可以同时进行,而不会互相影响。
2)写锁:当前操作没有完成之前,它会阻断其他写锁和读锁。
3.1 MyISAM表锁
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MylSAM表显式加锁。
3.2 InnoDB行锁
InnoDB与MyISAM的最大不同有两点:一是支持事务;二是采用了行锁;
操作:
参考
https://blog.csdn.net/weixin_33724264/article/details/113442844
https://www.bilibili.com/video/BV1iF411z7Pu?p=159&spm_id_from=pageDriver