2、事务(transaction)
2.1、 什么是事务
什么是事务
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
原子性:一个事务中的所有操作要么全部完成,要么全部不完成。
一致性:事务执行前后数据库的状态保存一致。
隔离性:多个并发事务对数据库进行操作,事务间互不干扰
持久性:事务执行完毕,对数据的修改是永久的,即使系统故障也不会丢失
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-soAIbh6g-1630336361037)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20210830200910919.png)]
数据库中多个事务同时进行可能会出现什么问题?
-
丢失修改
-
脏读:当前事务可以查看到别的事务未提交的数据。
-
不可重读:在同一事务中,使用相同的查询语句,同一数据资源莫名改变了。
-
幻读:在同一事务中,使用相同的查询语句,莫名多出了一些之前不存在的数据,或莫名少了一些原先存在的数据。
SQL的事务隔离级别有哪些?
读未提交:
一个事务还没提交,它做的变更就能被别的事务看到。
读提交:一个事务提交后,它做的变更才能被别的事务看到。
可重复读:
一个事务执行过程中看到的数据总是和事务启动时看到的数据是一致的。在这个级别下事务未
提交,做出的变更其它事务也看不到。
串行化:
对于同一行记录进行读写会分别加读写锁,当发生读写锁冲突,后面执行的事务需等前面执行
的事务完成才能继续执行。
执行事务
-- =====================事务=======================
-- mysql是默认开启事务自动提交的
set autocommit=0/*关闭*/
set autocommit=1/*开启(默认的)*/
-- 手动处理事务
set autocommit=0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开启,从这之后的sql都在同一个事务内
-- 提交:持久化(成功!)
COMMIT
-- 回滚:回到原来的样子(失败!)
ROLLBACK
-- 事务结束
set autocommit=1 -- 开启自定提交
SAVEPOINT -- 保存点名,设置一个事务的报存点
ROLLBACK to SAVEPOINT -- 回滚到保存点
RELEASE SAVEPOINT-- 删除保存点
模拟场景
-- 转账
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')
-- 模拟转账
SET autocommit=0; -- 关闭自动提交
START TRANSACTION-- 开启一个事务(一组事务)
UPDATE account set money=money-500 WHERE `name`='A' -- A减500
UPDATE account set money=money+500 WHERE `name`='B' -- B减500
COMMIT; -- 提交
ROLLBACK;-- 回滚
SET autocommit=1; -- 恢复默认值
3、索引
索引是什么?
索引是帮助mysql高效获取数据的数据结构
3.1、索引的分类
在一个表中,主键索引只能有一个,唯一索引可以有多个
- 主键索引 (primary key)
- 唯一标识 ,主键不可重复,只能有一个列作为主键
- 唯一索引 (unique key)
- 避免重复的列出现,唯一索引可以重复,多个列
- 常规索引 (key/index)
- 默认的,index、key关键字
- 全文索引 (fulltext)
- 在特定的数据库引擎下才有
- 快速定位数据
基础语法
-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后,增加索引
-- 显示所有的索引信息
show INDEX FROM student
-- 增加一个全文索引 (索引名) 列名
ALTER TABLE schooll.student add FULLTEXT INDEX `studentname`(`studentname`)
-- explain 分析sql执行的状况
EXPLAIN SELECT * FROM schooll.student -- 非全文索引
EXPLAIN SELECT * FROM schooll.student WHERE MATCH(studentname) against('刘')