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. Java并发:Condition接口

    Condition 接口与 Lock 配合实现了等待 / 通知模式,这个和 Object 的监视器方法(wait.notify.notifyAll 等方法)一样,都是实现了等待 / 通知模式,但这两者 ...

  2. 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析

    从 DDC 嗅探器到 sddc_sdk_lib 的数据解析 之前的 DDC 协议介绍 主要讲了设备加入.退出以及维持设备状态,而 SDK框架 sddc_sdk_lib 解析 主要讲了 SDK 库的结构 ...

  3. python re:正向肯定预查(?=)和反向肯定预查(?<=)

    参考资料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html (?=pattern) 正向肯定预查,在任何匹配pattern的字符串 ...

  4. CSS 盒子的边距塌陷

    tip:为能更直观地学习,本文章已省略部分 css 样式代码. 我相信下面的情形大家在日常工作中常常碰到:在制作静态页面中,为了页面整体的协调与美观,我们想让子盒子 image-div 的上边沿距离父 ...

  5. {% csrf_token %} 原理和作用 (踩坑必看)

    本博客已暂停更新,请转自新博客 https://www.whbwiki.com/320.html 继续阅读 简介 在django中我们需要在templates的form中加入{%csrf_token% ...

  6. Flink 实践教程 - 入门(4):读取 MySQL 数据写入到 ES

    ​作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接. ...

  7. appium环境搭建基于安卓(mac系统)

    1.需要环境 JDK Python Andriod SDK Node.js Appium Appium-Python-Client Appium-doctor 2.安装jdk(我的版本是1.8) 下载 ...

  8. Linux内核内存检测工具KASAN

    KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题.KASAN 集成在 Linux 内核中,随 ...

  9. c++学习笔记(四)

    动态内存分配 使用new分配内存 1.指针的用处是在运行阶段分配未命名的内存以储存值. 2.在此情况下,只能通过指针来访问内存. int *ptr_int=new int;//在内存阶段为一个int值 ...

  10. psutil模块详解

    import psutil#1.系统性能信息模块psutilmem = psutil.virtual_memory()print(mem)#svmem(total=8442675200, availa ...