概念:事务指的是满足ACID特性的一组操作,可以通过commit提交一个事务,也使用rollback进行回滚。一个或一组语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 事务的ACID属性:
事务的创建:
set autocommit=0;
start transaction; # 可选的
语句1;
语句2;
...
设置回滚点;
savepoint 节点名; #设置保存点
commit; #提交事务
rollback; #回滚事务 (相当于操作无效)
(以上二者取其一)
回滚到指定的地方:rollback to回滚点名;
示例:
set autocommit=0;
start transaction;
delete from account where id=25;
savepoint a; #设置保存点
delete from account where id=28;
rollback to a;#回滚到保存点
#删了id=25,未删id=28
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
查看隔离级别:
select @@tx_isolation;
设置隔离级别:
set session transaction isolation level 隔离级别;
含义:
应用场景
好处:
重用sql语句
简化复杂的sql操作,不必知道它的查询细节
保护数据,提高安全性(看不到原始表)
案例:查询姓张的学生名和专业名
#不使用视图
select stuname,majorname
from stuinfo s
inner join major m
on s.majorid=m.id
where s.stuname like '张%';
#将常用的表封装成一个视图
create view v1
as
select stuname,majorname
from stuinfo s
inner join major m on s.majorid = m.id
#从视图中查询
select * from v1 where stuname like '张%';
1. 创建视图
create view 视图名
as
查询语句;
2. 视图修改
方式一
create or replace view 视图名
as
查询语句;
方式二
alter view 视图名
as
查询语句;
3. 删除视图
drop view 视图名,视图名,...;
4. 查看视图
desc myv3;
show create view myv3;
5. 视图的更新 与此同时,原表也会被修改
1.插入
insert into myv1 values('张飞','zf@qq.com');
2.修改
update myv1 set last_name=‘张无忌’ where last_name =‘张飞’;
3.删除
delete from myv1 where last_name = '张无忌';
一般视图不允许修改,只能读 具备以下特点的视图不允许更新: 1.包含以下关键字的SQL语句:分组函数、DISTINCT,GROUP BY,HAVING ,UNION 或者 UNION ALL 2.常量视图 3.select中包含子查询 4.join 5.from 一个不能更新的视图 6.where子句的子查询引用了from子句中的表
6. 视图和表的对比:
创建语法的关键字 是否实际占用物理空间 使用 视图 create view 只是保存了sql逻辑 查,一般不能增删改 表 create table 保存了数据 增删改查
类似于java中的方法 好处: 提高代码的重用性 ; 简化操作
1. 存储过程 含义:一组预先编译好的SQL语句的集合,理解成批处理语句
语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的SQL语句)
end
注意: 1.参数列表包含三部分 :参数模式 参数名 参数类型 ex: in stuname varchar(20) 参数模式: in:该参数可以作为输入,也就是改参数需要调用方法传入值 out:该参数可以作为输出,也就是该参数可以作为返回值 inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值 2.如果存储过程体仅仅只有一句话,begin end 可以省略 存储过程体中的每条SQL语句的结尾要求必须加分号。 存储过程的结尾可以使用delimiter重新设置 语法: delimiter 结束标记 案例: delimiter $(用这个标记代替delimiter)
call 存储过程名(实参列表);
不同种类
1.
delimiter $
create procedure mypl()
begin
insert into admin(username,password)
values('john','0000');
end $
#调用
call mypl()$
2.创建带in模式参数的存储过程
#案例1:创建存储过程,根据女神名,查询对应的男神信息
create procedure myp2(in beautyName VARCHAR(20))
begin
select bo.*
from boys bo
right join beauty b on bo.id = b.boyfriend_id
where b.name = beautyName
end $
#调用
call myp2('柳岩')$
3.创建存储过程,用户是否登录成功
create procedure myp3(in username varchar(20),in password varchar(20))
begin
begin result int default 0;#声明并初始化变量
select count(*) into result#给变量赋值
from admin
where admin.username = username
and admin.password = password;
select if(result>0,'成功',‘失败’);#使用变量,就是打印变量
end $
#调用
call myp3('张飞',‘8888’)$
4.带Out模式的存储过程
案例1:根据女神名,返回对应的男神名
create procedure myp5(in beautyName varchar(20),out boyName varchar(20))
begin
select bo.boyName in boyName
from boys bo
inner join beauty b
on bo.id=b.boyfriend_id
where b.name=beautyName;
end $
#调用
call myp5(‘小昭’,@bName)$ #@bName是用户变量名
select @bName$
案例2:根据女神名,返回对应的男神名和男神魅力值
create procedure myp6(in beautyName varchar(20),out boyname varchar(20),out userCP int)
begin
select bo.boyName,bo.userCP into boyName,usercp
from boys bo
inner join beauty b
on bo.id=b.boyfriend_id
where b.name=beautyName;
end $
#调用
call myp5(‘小昭’,@bName,@usercp)$
select @bName,@usercp$
5:创建带inout模式参数的存储过程
案例1:传入a和b两个值,最终a和b都翻倍并返回
create procedure myp8(inout a int,inout b int)
begin
set a = a*2;
set b = b*2;
end $
#调用
set @m=10$
set @n=20$
call myp8(@m,@n)$
select @m,@n$
drop procedure 存储过程名
show create procedure 存储过程名;
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100179.html原文链接:https://javaforall.cn