MySQL--新手必备SQL基础知识事务ACID及隔离级别

Posted 吾日三省贾斯汀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL--新手必备SQL基础知识事务ACID及隔离级别相关的知识,希望对你有一定的参考价值。

❤️‍您好,我是贾斯汀,本文主要分享数据库的一些基础知识!❤️‍

SQL

什么是SQL?

【百度百科】

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL有哪几个部分?

SQL主要包括DQL、DML、DDL、TCL、DCL、CCL六大部分。

DQL(Data Query Language)数据查询语言

语法:SELECT
说明: 用于查询
例子:
–普通查询
SELECT * FROM table_name WHERE column_name = ‘xxx’;
–包含查询(且and 、或or 、包含in、不包含not in)
SELECT * FROM table WHERE column_name1 = ‘xxx1’ and column2 = ‘xxx2’;
SELECT * FROM table WHERE column_name in(‘xxx1’,‘xxx2’);
–分组查询(group by的字段,在select中要包含该字段)
SELECT column_name FROM table_name GROUP BY column_name ;
–排序查询(默认esc升序,指定desc降序)
SELECT * from FROM table_name ORDER BY column_name desc;
–模糊查询(模糊左边%xx,模糊右边xx%,模糊中间%xx%)
SELECT * FROM table_name where column_name like ‘%张%’;
–范围查询(between value1 and value2 或者 大于> 小于< 不等于!=(转义写法<>) )
SELECT * FROM table_name where column_name between 1 and 10;
–分页查询(limit value1,value2 从value1行(0表示第一行)开始,取value2行)
SELECT * FROM table_name limit 0,10;

DML(Data Manipulation Language )数据操纵语言

语法:INSERT、UPDATE、DELETE
说明:分别用于插入、更新、清空操作,DML属于显示COMMIT提交事务,事务往后介绍;
例子:
–单条插入
INSERT INTO table_name(id,name) VALUES(1,‘Justin’);
–多条插入
INSERT INTO table_name(id,name) VALUES(1,‘Justin’),(2,‘Jack’),(3,‘Tom’);
–条件更新(条件大多可以跟前面DQL查询的条件一样)
UPDATE table_name SET column_name = ‘xxx2’ WHERE column_name = ‘xxx’;
–条件清空
DELETE FROM table_name WHERE column_name = ‘xxx’;

DDL(Data Definition Language)数据定义语言

语法:CREATE、ALTER、DROP、TRUNCATE
说明: 主要用于操作表,分别用于创建、修改、删除、清空表,TRUNCATEDELETE都可以清空表数据,主要区别在于TRUNCATE属于DDL,隐式COMMIT事务,无法ROLLBACK,而DELETE属于DML,显式COMMIT事务,只要还没COMMIT,都可以进行ROLLBACK。
例如:
--创建表
create table test.demo_info(
id int primary key not null auto_increment,
name varchar(255),
sex char(1),
age int(3)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
--修改表(删除/添加主键、添加表及字段备注、修改字段、添加新字段、删除字段、设置表编码等)
alter table table_name drop primary_key; --删除主键
alter table table_name add primary key(id); --添加主键
alter table table_name modify COLUMN id int not null auto_increment primary key; --修改字段为主键并设置主键自增
alter table table_name comment ‘表备注’;
alter table table_name modify COLUMN id int not null auto_incrment comment ‘主键字段备注’;
alter table table_name modify COLUMN column_name varchar(255) comment ‘普通字段备注’;
alter table table_name add COLUMN column_name varchar(255) not null ; --添加字段
alter table table_name modify COLUMN column_name varchar(255) not null ; --修改字段
alter table table_name drop COLUMN column_name; --删除字段
alter database dabase_name character set utf8 collate utf8_bin; --修改整个库的编码,utf8_bin表示区分大小写,utf8_general_ci则不区分大小写
alter table table_name convert to character set utf8 collate utf8_bin; --修改表及所有字段的编码;
alter table table_name default character set utf8 collate utf8_bin; --仅修改表的编码;
alter table table_name change column column_name column_name varchar(255) character set utf8 collate utf8_general_ci not null; --仅修改指定表下指定字段的编码,column_name要写两遍,且保留字段非空、类型等属性
--删除表
drop table_name;
--清空表
TRUNCATE table_name;

TCL(Transaction Control Language)事务控制语言

例如:BEGIN/START、SAVEPOINT、COMMIT、ROLLBACK
说明: 前面提到的显式事务隐式事务,DML属于显式事务(手动COMMIT提交),DDL属于隐式事务(自动COMMIT提交);
例子:

  • 开启事务
    BEGIN TRANSACTION;
    或者START TRANSACTION;
  • 保存点
    SAVEPOINT TRANSACTION SAVEPOINT_NAME;
  • 提交事务
    COMMIT TRANSACTION;
  • 回滚事务
    ROLLBACK TRANSACTION SAVEPOINT_NAME;
    PS:事务一旦COMMIT,无法再ROLLBACK,如果想要恢复到原来的数据,可以考虑业界内流传的"闪回"原理实现。

DCL(Data Control Language)数据控制语言

语法:GRANT、REVOKE
说明:分别用于授权、撤权操作;
例子:
-- 授权
GRANT ALL PRIVILEGES ON . to ‘username’@’%’ identified by ‘password’; --所有权限
GRANT SELECT, INSERT, CREATE ON . TO ‘username’@’%’; – 指定权限
--撤权
REVOKE INSERT, CREATE ON . TO ‘username’@’%’; – 指定权限
--刷新
FLUSH PRIVILEGES; --GRANT/REVOKE都要刷新权限才生效
--查询权限
select * from mysql.user where user = ‘username’ \\G; --看到Y表示有权限

具体GRANT/REVOKE所有相关权限,可参照官方文档:https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

CCL(Cursor Control Language)指针控制语言

语法:DECLARE CURSOR、FETCH INTO、UPDATE WHERE CURRENT
说明: 用于对一个或多个表单独行的操作,实际比较少用,感兴趣的小伙伴可以查阅资料了解下。
例子:
--声明游标
DECLARE CURSOR
--进入
FETCH INTO
--更新当前位置
UPDATE WHERE CURRENT

事务

什么是事务?

  • 事务简单说就是应用程序,比如使用C++或Java等编程语言编写的应用程序中,使用结构化查询语言SQL操作数据库的一系列操作,只不过所有的操作都比较严谨;
  • 通过SQL的TCL事务控制语言BEGIN/SAVEPOINT/ROLLBACK/COMMIT对事务进行控制,事务具有ACID四大特性。

事务的ACID四大特性?

事务ACID四大特性, A是原子性,C是一致性,I是隔离性,D是持久性。

  • 原子性(Atomicity): 指的是事务过程中的一系列操作All success or all fail,if errror will rollback,比如银行转账,转账成功,转账方账户-100,收款方账户+100,转账失败则回滚事务保证双方账户余额不变;
  • 一致性(Consistency): 是指事务完成后,能够保证事务操作前、事务操作后的数据都要符合预期结果,比如转账前,双方账户余额都是200,转账100成功后,转账方余额扣100剩余100,收款方余额增加100余额为300,不能扣了转账方100,收款方余额却没变;
  • 隔离性(Isolation): 是指并发访问使得多个事务可能会同时对同一数据进行操作,当第一个事务对数据进行操作时,如果有其他事务也来进行操作,会被隔离,等待前一个事务完成后再操作,如果没有隔离性,就会导致数据脏读;
  • 持久性(Durability): 指的是对事务COMMIT即永久,也就是事务执行过程中,所有对数据库数据做的变更,一旦事务COMMIT,将被永久生效,无法使用ROLLBACK进行回滚;

事务的隔离级别?

标准的SQL,定义了4中事务隔离级别,分别为读提交、读未提交、可重复读、序列化

  • 读未提交(READ-UNCOMMIT): 一个事务还未提交时,它所做的变更就能被其他事务看到;

  • 读已提交(READ-COMMIT): Oracle默认事务隔离级别,一个事务提交后,它做的变更才会被其他事务看到;

  • 可重复读(REPEATABLE-READ): MySQL默认的事务隔离级别,一个事务在执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,并且未提交变更对其他事务不可见;

  • 序列化(SERIALIZABLE): 对于同一行数据,写会加写锁,读会加读锁,读写锁冲突时,后访问的事务必须等待前一个事务执行完成,才能继续执行。

以上是关于MySQL--新手必备SQL基础知识事务ACID及隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

深入学习MySQL事务:ACID特性的实现原理

深入学习MySQL事务:ACID特性的实现原理

深入学习MySQL事务:ACID特性的实现原理

Mysql事务隔离级别及ACID实现原理

MySQL之数据库存储引擎及事务ACID特性

MySQL事务篇:ACID原则事务隔离级别及事务机制原理剖析