mysql事务控制语言TCL
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的更多相关文章
- MySQL数据库笔记三:数据查询语言(DQL)与事务控制语言(TCL)
五.数据查询语言(DQL) (重中之重) 完整语法格式: select 表达式1|字段,.... [from 表名 where 条件] [group by 列名] [having 条件] [order ...
- <MySQL>入门四 事务控制语言 TCL
-- TCL /* Transcation Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账 name ...
- MySql——事务控制语言(DTL)
什么是事务(控制台只能是内存的操作) 通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行. 那么我们说,这个“一次性执行”的过程,可以称为“一个事务”. 简单来说,“一条sql语句, ...
- 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引
一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...
- TCL(事务控制语言)
#TCL/*Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行. 案例:转账 张三丰 1000 ...
- oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- oracle学习笔记(四) DML数据控制语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- MySQL入门详解(二)---mysql事务、锁、以及优化
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题.而事 ...
- MySQL笔记总结-TCL语言
TCL语言 事务 一.含义 事务控制语言 Transaction Control Language 事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行 二.特点(ACID ...
随机推荐
- Python matplotlib 概率论与数理统计 伯努利分布 二项分布
Python 代码实现 二项分布 import numpy as np import matplotlib.pyplot as plt import math from scipy import st ...
- Python 模块 itertools
python 2.6 引入了itertools模块,使得排列组合的实现非常简单: import itertools 有序排列:e.g., 4个数内选2个排列: >>> print l ...
- ONVIF协议客户端
前几天跟大家聊了一些关于ONVIF的一些基础知识,它的工作原理以及优势.今天安徽思蔷信息科技为带大家了解一下simpleonvif 百度云盘下载地址:链接:https://pan.baidu.com/ ...
- elasitcsearch单机版安装
1.下载压缩包 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz 2.解压修改配置文件 c ...
- elasticsearch中query_string的隐藏坑
elasticsearch查询中使用filter查询添加query_string格式为: { "query_string": { ...
- C#生成新浪微博短网址 示例源码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DotN ...
- FZU ICPC 2020 寒假训练 5 —— 排序
P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的 N 个数从小到大排序后输出.快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成. ...
- updatexml和extractvalue函数报错注入
updatexml()函数报错注入 updatexml (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XM ...
- [spojQTREE6]Query on a tree VI
考虑如下构造: 新建一条边$(0,1)$,并将原树以0为根建树,记$fa_{x}$为$x$的父亲(其中$1\le x\le n$) 维护两棵森林,分别记作$T_{0/1}$,每一条边恰属于一棵,其中$ ...
- [bzoj1483]梦幻布丁
对于每一个颜色用一个链表存储,并记录下:1.当前某种颜色的真实颜色:2.这种颜色的数量(用于启发式合并的判断):3.当前答案(即有几段),然后对于每一个操作简单处理一下就行了. 1 #include& ...