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 ...
随机推荐
- Java并发:Condition接口
Condition 接口与 Lock 配合实现了等待 / 通知模式,这个和 Object 的监视器方法(wait.notify.notifyAll 等方法)一样,都是实现了等待 / 通知模式,但这两者 ...
- 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析
从 DDC 嗅探器到 sddc_sdk_lib 的数据解析 之前的 DDC 协议介绍 主要讲了设备加入.退出以及维持设备状态,而 SDK框架 sddc_sdk_lib 解析 主要讲了 SDK 库的结构 ...
- python re:正向肯定预查(?=)和反向肯定预查(?<=)
参考资料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html (?=pattern) 正向肯定预查,在任何匹配pattern的字符串 ...
- CSS 盒子的边距塌陷
tip:为能更直观地学习,本文章已省略部分 css 样式代码. 我相信下面的情形大家在日常工作中常常碰到:在制作静态页面中,为了页面整体的协调与美观,我们想让子盒子 image-div 的上边沿距离父 ...
- {% csrf_token %} 原理和作用 (踩坑必看)
本博客已暂停更新,请转自新博客 https://www.whbwiki.com/320.html 继续阅读 简介 在django中我们需要在templates的form中加入{%csrf_token% ...
- Flink 实践教程 - 入门(4):读取 MySQL 数据写入到 ES
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接. ...
- appium环境搭建基于安卓(mac系统)
1.需要环境 JDK Python Andriod SDK Node.js Appium Appium-Python-Client Appium-doctor 2.安装jdk(我的版本是1.8) 下载 ...
- Linux内核内存检测工具KASAN
KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题.KASAN 集成在 Linux 内核中,随 ...
- c++学习笔记(四)
动态内存分配 使用new分配内存 1.指针的用处是在运行阶段分配未命名的内存以储存值. 2.在此情况下,只能通过指针来访问内存. int *ptr_int=new int;//在内存阶段为一个int值 ...
- psutil模块详解
import psutil#1.系统性能信息模块psutilmem = psutil.virtual_memory()print(mem)#svmem(total=8442675200, availa ...