Transaction Control Language 事务控制语言

事务:一个或一组sql语句组成一个执行单元,这个执行单元作为不可分割的整体执行。如果某个语句执行错误,整个单元回滚到最初的状态。

在mysql中用的最多的存储引擎有innodb,myisam,memor。其中innodb支持事务。通过show engines查看mysql支持的存储引擎。

特点

事务的ACID属性

原子性(Atomicity):事务是一个不可分割的单位

一致性(Consistency):数据从一个一致状态切换到另外一个一致状态

隔离性(Isolation):一个事务的执行不受其他事务干扰

持久性(Durability):一个事务一旦被提交,对数据库中数据的改变就是永久性的

事务的创建

隐式事务:事务没有明显的开启和结束标记

比如:select、insert、update、delete语句(DML) - 自动提交默认开启show variables like 'autocommit'

显示事务:事务具有明显的开启和结束标记

前提:必须先设置自动提交功能为禁用set autocommit = 0,仅对当前的事务有效

# 步骤1:开启事务
set autoccommit = 0;
start transaction; # 可选 # 步骤2:编写事务中的sql语句(select insert update delete) # 步骤3:结束事务
commit; # 提交事务
rollback; # 回滚事务

隔离级别

如果同时运行多个事务,访问数据库中相同的数据时,需要采用隔离机制。

事务的并发问题

脏读:对于两个事务,t1,t2,如果T1读取了已经被t2修改过的但是还没有提交的数据,但是最后t2回滚了,t1读取的内容是临时并且无效的

不可重复读:对于两个事务,T1,T2读取了一个字段的值,但是T2更新了这个字段,T1再次读取的时候,两读取的数据是不一致的 - 针对更新

幻读:对于两个事务T1,T2,T1从一个表中按照一定的条件读取字段,接着T2将表进行了更新,插入几行新数据,当T1再次以相同的条件进行读取的时候,会出现新的数据 - 针对插入删除

事务的隔离级别

查看当前隔离级别

select @@tx_isolation

设置当前mysql连接的隔离级别

set 【session】 transaction isolation level 隔离级别

设置数据库系统的全局的隔离级别

set global transaction isolation level 隔离级别

设置保存点,搭配rollback使用

savepoint 节点名;

rollback to 节点名;

类型 脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read(mysql默认) × ×
serializable × × ×

delete和truncate在事务使用时的区别

语法:truncate table 表名;

delete from 表名

说明:删除(清空)整个表

1.如果要删除的表中有自增长列,delete删除后,插入数据从自增长列的断点开始,truncate从1开始

2.delete删除有返回值(受影响的行数),truncate删除没有返回值

3.truncate删除不能回滚,delete删除可以回滚

4.delete可以加where条件,truncate不能加where条件

视图

虚拟表(临时),并没有真实保存数据,动态生成

应用场景:

1.多个地方用到同样的查询结果

2.该查询结果使用的sql语句较为复杂

语法:

create view 视图名

as

sql查询语句

创建视图

语法:

create view 视图名

as

sql查询语句

CREATE VIEW myv
AS
SELECT * FROM employees;
SELECT * FROM myv;

修改视图

方式1语法:

create or replace view 视图名

as

查询语句

方式2语法:

alter view 视图名

as

查询语句

查看视图/删除视图

删除视图语法:drop view 视图名,视图名

查看视图语法:DESC 视图名

# 1.创建视图emp_v1,要求查询电话号码以'011'开头的员工姓名和工资、邮箱
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,salary,email
FROM employees
WHERE phone_number LIKE '011%'; SELECT * FROM emp_v1; # 2.创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息
CREATE OR REPLACE VIEW emp_v2
AS
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 12000 SELECT *
FROM emp_v2 m
JOIN departments d
ON d.department_id = m.department_id

更新视图(数据)

为了保护原始表,一般设置视图的权限为只读

视图的可更新性和视图中查询的定义有关系,具备一下特点的视图不允许更新(基本都不可以)

1.分组函数,distinct,group by,having,union或者union all

2.常量视图

3.select中包含子查询

4.join/连接

5.from 一个不能更新的视图

6.where子句的子查询引用了from子句中的表

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees; SELECT * FROM myv1;
SELECT * FROM employees; # 1.插入 原始表也会插入数据
INSERT INTO myv1 VALUES('张飞','zf@qq.com'); # 2.修改 原始表也会更新
UPDATE myv1 SET last_name = '张无忌' WHERE last_name = '张飞'; # 3.删除 原始表也会删除
DELETE FROM myv1 WHERE last_name = '张无忌'

视图与表的对比

类型 创建语法关键字 是否实际占用物理空间
视图 create view 只保存了sql逻辑
create table 保存了数据

存储过程与函数

类似与java中的方法

变量

系统变量:属于服务器层面,由系统提供

全局变量:服务器每次启动将为所有的全局变量赋初始值,针对所有的会话有效,不能跨重启

会话变量:服务器为每一个连接的客服端都提供了系统变量,针对于当前会话(连接)有效 - 默认

自定义变量

用户变量:针对与当前会话(连接有效) 应用在任何地方 - 默认

局部变量:作用域仅仅在定义它的begin end中有效,应用在begin end里的第一句话

系统变量

默认查看会话session变量

查看所有的系统变量

show 【globle/session】 varibles;

查看满足条件的部分系统变量

show 【globle/session】 varibles like '%char%';

查看指定的某个变量的值,一般具体的值select

select @@【globle/session】.系统变量名;

为某个系统变量赋值

set 【globle/session】 系统变量名 = 值

set @@【globle/session】.系统变量名 = 值

自定义变量

用户变量

1.声明并初始化

SET @用户变量名=值

SET @用户变量名:=值

SELECT @用户变量名:=值

2.赋值(更新用户变量的值)

方式一:通过SET或SELECT

SET @用户变量名=值

SET @用户变量名:=值

SELECT @用户变量名:=值

方式二:通过SELECT INTO

SELECT 字段 INTO 变量名 FROM 表

3.使用

SELECT @用户变量名

局部变量

1.声明

begin

declare 变量名 类型

declare 变量名 类型 dedault 值

end

2.赋值(更新用户变量的值)

方式一:通过SET或SELECT

SET 用户变量名=值

SET 用户变量名:=值

SELECT @用户变量名:=值

方式二:通过SELECT INTO

SELECT 字段 INTO 局部变量名 FROM 表

3.使用

SELECT 局部变量名

存储过程

概念:一组预先编译好的SQL语句的集合

优点:

1.提高代码的重用性

2.简化操作

3.减少了编译次数并减少了和数据库服务器的连接次数,提高效率

创建

create procedure 存储过程名(参数列表)

BEGIN

存储过程体

END

说明:

1.参数列表包含三部分

参数模式 参数名 参数类型

比如: IN stuname VARCHAR(20) 默认是IN

2.如果存储过程体只有一句话,begin end 可以省略

3.存储过程体中的每条SQL语句的结尾要求加分号,存储过程的结尾可以使用DELIMITER重新设置 DELIMITER 结束标记之后的结尾也要使用重新设置的结束标志

4.需要在cmd命令行中运行

参数模式

IN:该参数可以作为输入,该参数需要调用方传入值(平时的参数) - 默认

OUT:该参数可以作为输出,该参数可以作为返回值,调用时自动返回

INOUT:该参数既可以作为输入又可以作为输出

调用

语法:call 存储过程名(实参列表)

# 案例1:插入departments表中五条记录

SELECT * FROM departments;
DELIMITER . # 这里不加分号了!!
CREATE PROCEDURE mypl1()
BEGIN
INSERT INTO departments
VALUES(280,'ranan',201,1700)
,(281,'ranan1',201,1700)
,(282,'ranan2',201,1700)
,(283,'ranan3',201,1700)
,(284,'ranan4',201,1700);
END . CALL mypl() . # 案例2:用户是否登陆成功IN
CREATE PROCEDURE mypl2(in username varchar(20),in password varchar(20))
BEGIN
declare result varchar(20) default '';
select count(*) into result
from admin
where admin.username = username
and admin.password = password;
select if(result=0,'登陆失败','登陆成功')
END . CALL mypl2('ranan','123') . #
CREATE PROCEDURE mypl3(in username varchar(20),out password varchar(20))
BEGIN
select xx into boyName
END . set @boy. # 用于接收返回值,可以省略
call mypl3('ranan',@boy).
select @boy.

删除

语法: drop procedure 存储过程名

一次只能删除一个存储过程

查看存储过程的信息

语法:

show create procedure 存储过程名

desc 表/视图

函数

*区别

存储过程:可以有0个或多个返回值,适合做批量插入、更新

函数:有且仅有1个返回值,适合处理数据后返回一个结果

创建

create function 函数名(参数列表) returns 返回类型

begin

函数体

end

说明:

1.参数列表包含两部分

参数名 参数类型

2.函数体必须有return语句

3.函数体只有一句话,begin end 可以省略

4.使用delimiter语句作为设置结束标记

调用

说明:执行函数所有的语句,并且显示返回值

select 函数名(参数列表)

# 案例:返回公司的员工个数
DELIMITER $
CREATE FUNCTION myfl() RETURNS INT
BEGIN
DECLARE em_count INT;
SELECT COUNT(*) INTO em_count
FROM employees;
return em_count
END $
select myfl()&

查看函数

show create function 函数名

删除函数

drop function 函数名

流程控制结构

分支结构

if函数

if(表达式,成立执行,不成立执行)

case结构

case函数的使用一:switch case -> 适用于等值判断

格式:

case 要判断的字段或表达式

when 常量1 then 要显示的值1或语句1 (;是语句时添加)

when 常量2 then 要显示的值2或语句2 (;是语句时添加)

else 默认情况返回的值或语句;(;是语句时添加)

end (case;语句时添加)

注意:

case做表达式时,then后是显示的值

case做语句时,then后是语句

case函数的使用二:类似于多重if -> 适用于不等式的判断

格式:

case

when 条件1 then 满足条件1要显示的值1或语句1(;是语句时添加)

when 条件2 then 满足条件2要显示的值2或语句2(;是语句时添加)

else 要显示的值n或语句n; (;是语句时添加)

end (case;语句时添加)

特点:

1.可以作为表达式(返回值)嵌套其他语句中使用,可以放在任何地方;可以作为独立的语句(返回的是语句)去使用,只能放在begin end

2.else可以省略,如果都满足返回null

# 创建存储过程,根据传入的成绩来显示成绩
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score BETWEEN 90 AND 100 THEN SELECT 'A';
WHEN score BETWEEN 60 AND 90 THEN SELECT 'B';
ELSE SELECT 'C';
END CASE;
END $

if结构

功能:实现多重分支

语法:

begin

if 条件1 then 语句1;

elseif 条件2 then 语句2;

【else 语句n;】

end if;

end

应用:只能应用在begin end中

CREATE function test_case(score INT) return char
BEGIN
if score BETWEEN 90 AND 100 THEN return 'A';
elseif score BETWEEN 60 AND 90 THEN teturn 'B';
ELSE return'C';
END if;
END $

循环结构

1.标签搭配循环控制的使用

2.必须放在begin end里面

while

先判断后执行

【标签(名字):】while 循环条件 do

循环体;

end while 【标签(名字)】;

# 如果次数>20则停止

CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<insertCount DO
INSERT INTO admin(username,password) VALUES(CONCAT('rose'+i),'666');
if i>=20 then leave a;
end if;
SET i=i+1;
END WHILE a;
END $
CALL pro_while(10)$

loop

【标签(名字):】loop

循环体;

end loop 【标签(名字)】;

说明:

1.可以用来模拟简单的死循环

repeat

【标签(名字):】repeat

循环体;

until 结束循环的条件

end repeat 【标签(名字)】;

说明:

1.先执行后判断,循环体至少执行一次

循环控制

iterate(类似于continue) 结束本次循环,继续下次

leave(类似与break) 结束当前所在的循环

案例

/*
已知表stringcontent
其中字段:
id 自增长
contetn varchar(20) 向该表插入指定个数的,随机的字符串
*/ CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
contetn VARCHAR(20)
); DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT DEFAULT 1; #产生一个随机的整数,代表起始索引1-26
DECLARE len INT DEFAULT 1; # 代表截取的字符长度
WHILE i<=insertCount DO
SET startIndex =FLOOR(RAND()*26+1);
SET len =FLOOR(RAND()*(20-startIndex+1)+1);
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;
END WHILE;
END $

mysql事务控制语言TCL的更多相关文章

  1. MySQL数据库笔记三:数据查询语言(DQL)与事务控制语言(TCL)

    五.数据查询语言(DQL) (重中之重) 完整语法格式: select 表达式1|字段,.... [from 表名 where 条件] [group by 列名] [having 条件] [order ...

  2. <MySQL>入门四 事务控制语言 TCL

    -- TCL /* Transcation Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账 name ...

  3. MySql——事务控制语言(DTL)

    什么是事务(控制台只能是内存的操作) 通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行. 那么我们说,这个“一次性执行”的过程,可以称为“一个事务”. 简单来说,“一条sql语句, ...

  4. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引

    一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...

  5. TCL(事务控制语言)

    #TCL/*Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行. 案例:转账 张三丰 1000 ...

  6. oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言

    DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...

  7. oracle学习笔记(四) DML数据控制语言和TCL 事务控制语言

    DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...

  8. MySQL入门详解(二)---mysql事务、锁、以及优化

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题.而事 ...

  9. MySQL笔记总结-TCL语言

    TCL语言 事务 一.含义 事务控制语言 Transaction Control Language 事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行 二.特点(ACID ...

随机推荐

  1. OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104589085 学习课程:<2019王道考研计算机网络> 学习目的 ...

  2. dhcpd:bad subnet number/mask combination. subnet

    今天在调试wifi热点启动hdcpd服务时出现报错"bad subnet number/mask combination. subnet 192.168.1.1", Interne ...

  3. 树形DP 枚举祖宗的例题

    这类题目是真的很头疼....其实这类题目的特征也很明显,叶子结点贡献答案时和其所在链的祖宗有关,也就是说要想得知其贡献必须知道他的所有祖宗的贡献,其实处理方法也不是太难,就是在dfs枚举时顺便把祖宗的 ...

  4. hdu 2200 Eddy's AC难题(简单数学。。)

    题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. ...

  5. 安装配置多个版本JDK

    前言:JDK有多个版本,有时为了开发需要切换不同的版本,在一部电脑上安装多个JDK,只需要按以下配置,每次即可轻松使用.以下环境为Windows10 安装JDK 安装JDK8 配置环境变量 需要配置J ...

  6. Mac搭建以太坊私有链

    记录过程与问题 一.安装 以go版本的ethereum进行安装 brew tap ethereum/ethereum brew install ethereum # 如果希望基于ethereum的de ...

  7. httprunner3源码解读(3)client.py

    源码目录结构 ApiResponse 这个类没啥好说的 class ApiResponse(Response): """ 继承了requests模块中的Response类 ...

  8. 【Django】Mac 安装pip3-install-mysqlclient 报错

    1.首先在pip3-install-mysqlclient时报错 mysql_config not found 2.逛了一些博客 让安装mysql或者mysql-connector-c 我安装了后者还 ...

  9. docker安装pxc集群

      前言 现在mysql自建集群方案有多种,keepalived.MHA.PXC.MYSQL主备等,但是目前根据自身情况和条件,选择使用pxc的放来进行搭建,最大的好处就是,多主多备,即主从一体,没有 ...

  10. 基于Netty实现自定义消息通信协议(协议设计及解析应用实战)

    所谓的协议,是由语法.语义.时序这三个要素组成的一种规范,通信双方按照该协议规范来实现网络数据传输,这样通信双方才能实现数据正常通信和解析. 由于不同的中间件在功能方面有一定差异,所以其实应该是没有一 ...