前言:

本文内容:事务ACIS原则、事务实现转账、索引介绍及索引的分类

推荐免费MySQL基础讲解视频:【狂神说Java】MySQL最新教程通俗易懂_哔哩哔哩_bilibili

事务ACID原则、脏读、不可重复读、幻读

事务

要么都成功,要么都失败;

  1. SQL执行 A给B转账 A1000 --> 200 B 200
  2. SQL执行 B收到A的钱 A800 --> B 400

将一组SQL放在一个批次中去执行

ACID原则

原子性(atomicity,或称不可分割性)

  • 一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作。

一致性(consistency)

  • 事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。(最终完整性)

隔离性(isolation,又称独立性)

  • 事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能被其他事务干扰。

持久性(durability)

  • 一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中;即使数据库崩溃和宕机,当数据库重启后,一定能将数据库恢复到事务成功结束的状态。

事务的隔离级别

脏读

  • 指一个事务读取了另外一个事务未提交的数据。

不可重复读

  • 在一个事务内读取表中某一行数据,多次读取结果不同(这个不一定是错误)。

幻读

  • 指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

测试事务实现转账

执行事务步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 事务
-- mysql是默认开启事务自动提交的
set autocommit = 0; -- 关闭事务自动提交
set autocommit = 1; -- 开启事务自动提交(默认)

-- 手动处理事务
set autocommit = 0; -- 关闭自动提交

-- 事务开启
start transaction; -- 标记一个事务的开始 此后的sql都在同一个事务内

insert xx ;

-- 提交 持久化
commit;

-- 回滚 回到执行前
rollback;

-- 事务结束
set autocommit = 1; -- 开启事务自动提交

savepoint 保存点名; -- 设置一个事务的保存点
rollback to savepoint 保存点名; -- 回滚到保存点
release savepoint 保存点名; -- 撤销保存点

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 事务转账案例
-- 创建数据库
create database shop character set utf8 collate utf8_general_ci
-- 使用数据库
use shop
-- 创建账户表
create table `account`(
`id` int(3) not null auto_increment,
`name` varchar(20) not null,
`money` decimal(9,2) not null,
primary key (`id`)
)engine innodb default charset=utf8
-- 插入数据
insert into account(`name`,`money`) values('A',2000.00),('B',10000.00);
-- 转账事务
set autocommit = 0; -- 关闭自动提交
start transaction; -- 开启一个事务
update account set money=money-600 where `name` = 'A'; -- A减500
update account set money=money+600 where `name` = 'B'; -- B加500
commit; -- 提交事务
rollback; -- 回滚

set autocommit = 1; -- 恢复默认值

select * from account;

索引介绍及索引的分类

索引

索引(index)是帮助MySQL高效获取数据的数据结构。

本质:索引是数据结构

索引的分类

  • 主键索引(Primary key)
    • 唯一的标识,不可重复,只能有一个列作为主键。
  • 唯一索引(Unique key)
    • 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引。
  • 常规索引(key/index)
    • 默认的,index/key关键字来设置。
  • 全文索引(FullText)
    • 在特定的数据库引擎下才有,MyISAM。
    • 快速定位数据。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 索引的使用
-- 在创建表的时候给字段增加索引
-- 创佳你完毕后,增加索引

-- 显示所有的索引信息
show index from student;

-- 增加一个索引 索引名(列名)
alter table `student` add fulltext index `studentName`(`name`);

-- explain 分析sql执行的状况
explain select * from `student`;-- 非全文索引

explain select * from `student` where match(`name`) against('张');