mysql数据库--mysql事务及变量

回顾

外键:关联关系(表与表之间,表中字段指向另外一张表的主键)
	外键条件:字段类型必须一致,存储引擎必须为Innodb。
	外键约束:
		子表约束:不可插入父表不存在的数据。
		父表约束:三种约束模式(默认district,cascade,set null)
		经常使用的模式:on  delete  set  null  on  update  cascade

联合查询:union,多表合并和单表不同查询条件
	联合查询使用order  by;select  语句必须使用括号,还必须配合limit语句

子查询:查询语句中有查询语句
	分类:按位置(from,where和exists),按返回的用途(结果):标量,列,行和表

视图:view
	节省SQL语句:安全性控制
	试图本质:虚拟表,有结构无数据
	视图数据操作:多表只能改,单表可以增删改(增删有条件限制)
	视图算法:undefined未定义,temptable临时表和merge合并算法。

文件备份以及还原
	文件备份:存储引擎(myiasm适用)
	单表数据备份:只能备份数据
	SQL备份:备份的是SQL指令(mysqldump.exe客户端备份)
	增量备份:备份系统日志文件

事务安全

事务transaction:一系列要发生的连续的操作。
事务安全:一种保护连续操作同时满足(实现)的一种机制。为了保证数据的完整性。

需求:有一张银行账户表,有A用户给B用户转账;A账户先减少,B账户增加,但是A操作完了之后断电了导致A减少了B没有增加。

-- 创建一个账户表
create table my_account(
number char(16) not null unique comment '账户',
name varchar(20) not null,
money decimal(10,2) default 0.0 comment '账户余额'
)charset utf8;

-- 插入数据
insert into my_account values
('0000000000000001','张三',1000),
('0000000000000002','李四',2000);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事务操作:

事务操作分为两种:自动事务(默认的)和手动事务
手动事务:
1.开启事务:告诉系统以下所有的操作(写)不要直接写入到数据表,先存放到事务日志
start  transaction;

在这里插入图片描述

2.进行事务操作:一系列操作
a)李四账户减少
-- 事务操作:李四账户减少
update my_account set money = money - 1000 where id = 2;

在这里插入图片描述

b)张三账户增加

在这里插入图片描述

3.关闭事务:选择性的将日志文件中操作的结果保存到数据表(同步),或者直接清空事务日志(原来操作全部清空)
	a)提交事务:同步数据表(操作成功):commit
	b)回滚事务:直接清空日志表(操作失败):rollback
-- 提交事务
commit;

在这里插入图片描述

事务原理:

事务操作原理:事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到commit命令才会同步到数据表,
其他任何情况都会清空(rollback,断电,突然断开等)

在这里插入图片描述

事务的回滚点

回滚点:在某一个成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面的操作都已经成功,
可以在当前位置设置一个回滚点,可以供后续失败操作返回到该位置而不是返回所有操作,这个点称为回滚点。
设置回滚点语法:savepoint  回滚点名字;

-- 回滚点操作开启事务
start transaction;

-- 事务处理1:张三加钱
update my_account set money = money + 10000 where id = 1;

-- 查看结果
select * from my_account;

-- 设置回滚点
savepoint sp1;

-- 查看结果
select * from my_account;

在这里插入图片描述


回到回滚点语法:rollback  to  回滚点名字;
-- 银行扣税
update my_account set money = money - 10000* 0.05 where id = 2;  -- 错误

select * from my_account;

-- 回滚到回滚点
rollback to sp1;

select * from my_account;

在这里插入图片描述

-- 继续操作
update my_account set money = money - 10000* 0.05 where id = 1;

-- 查看结果
select * from my_account;

-- 提交数据改变数据表
commit;

在这里插入图片描述

自动事务处理:

在mysql中默认的都是自动事务处理,用户操作完成后会立即同步到数据表中
自动事务:系统通过autocommit变量控制
show  variables like  'autocommit';

在这里插入图片描述

关闭自动提交:set  autocommit  = off/0;
-- 关闭事务自动提交
set autocommit = 0;
show variables like 'autocommit';

在这里插入图片描述

再次直接写操作

在这里插入图片描述

自动关闭之后需要手动来选择处理:commit 提交,rollback 回滚。
在这里插入图片描述

注意:通常会使用自动事务,不可能在使用数据库的时候每次都提交会造成很多麻烦

在这里插入图片描述

事务特性:

事务有四大特性:ACID
	A:atomic原子性,事务的整个操作是一个整体,不可分割要不全部成功要不全部失败。
	C:consistency,一致性,事务操作的前后,数据表中的数据没有变化。
	I:isolation,隔离性,事务操作是相互隔离,不受影响
	D:durability,持久性,数据一旦提交不可改变

在这里插入图片描述

锁机制:Innodb默认是行锁,但是如果在事务操作的过程中没有使用到索引,那么系统会自动全表检索数据,自动升级为表锁。
行锁:只有当前行被锁住别的用户不能操作
表锁:整张表被锁住,别的用户不能操作
等待解锁使用commit或者rollback来进行释放

在这里插入图片描述

变量:

变量分为两种:系统变量和自定义变量

系统变量

系统定义好的变量:大部分的时候用户根本不需要使用系统变量:系统变量是用来控制服务器的变现的。
如:autocommit,auto_increment——increment等。
查看系统变量:show variables; -- 查看所有系统变量

在这里插入图片描述

查看具体变量值:任何一个有数据返回的内容都是由select查看
select  @@变量名;

在这里插入图片描述

修改系统变量

修改系统变量分为两种方式:会话级别和全局级别
会话级别:临时修改,当前客户端当次连接有效
set  变量名  =  值;
set  autocommit = 0;或者set  @@autocommit = 0;

在这里插入图片描述
在这里插入图片描述

全局级别:

一次修改永久有效,对所有客户端有效。一般不会修改
set  global autocommit = 0;

在这里插入图片描述

自定义变量

定义变量:为了区分系统变量,规定用户自定义变量必须使用一个@符号
set  @变量名  =  值;
查看依旧使用select
select  @变量名;

在这里插入图片描述

在MySQL中,“=”会默认的当做比较符号处理(很多地方),mysql为了区分比较和赋值的概念重新定义了一个新的赋值符号:  
:=(冒号+等于号)

在这里插入图片描述

mysql允许从数据表中获取数据然后赋值给变量两种方式:
方案一:边赋值边查看结果
select  @变量名  :=  字段名  from  数据源; -- 从字段中取值赋值给变量名,如果使用=会变成比较的意思
select * from my_student;
-- 从表中获取数据赋值给变量,使用=号
select @name = name,name from my_student;
-- 从表中获取数据赋值给变量,使用:=号
select @name := name,name from my_student;

在这里插入图片描述

方案2:只有赋值不看结果,要求很严格,数据记录最多只获取一条:mysql不支持数组
select  字段列表  from  表名  into  变量列表;
所有自定义变量都是会话级别,当前客户端当次连接有效

在这里插入图片描述

所有自定义变量不区分数据库由用户决定:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/84347110