• day 37小结


    事务

    ​ 通俗的说,事务指的是一组操作,要么都执行成功,要么都执行失败

    ​ 思考:
    ​ 我去银行给朋友汇款,
    ​ 我卡上有1000RMB,
    ​ 朋友卡上有1000RMB,
    ​ 我给朋友转账100元(无手续费),
    ​ 如果,我的钱刚扣,而朋友的钱又没加时,
    ​ 网线断了,怎么办呢?

    commit: 提交数据

    # 演示
    create table user(
    	id int auto_increment primary key,
        name varchar(32) not null default '',
        salary int not null default 0
    )charset utf8;
    
    insert into user (name,salary) values ('zekai',1000);
    insert into user (name,salary) values ('min',1000);
    

    解决的方法:
    使用事务:

    start transaction;
    	sql语句
    commit/rollback;
    
    # 例子
    mysql> start transaction;
    				Query OK, 0 rows affected (0.00 sec)
    
    				mysql> update user set salary=900 where name='zekai';
    				Query OK, 1 row affected (0.01 sec)
    				Rows matched: 1  Changed: 1  Warnings: 0
    
    				mysql> select * from user;
    				+----+-------+--------+
    				| id | name  | salary |
    				+----+-------+--------+
    				|  1 | zekai |    900 |
    				|  2 | min   |   1000 |
    				+----+-------+--------+
    				2 rows in set (0.00 sec)
    
    				mysql> update user set salary=1100 where name='min';
    				Query OK, 1 row affected (0.00 sec)
    				Rows matched: 1  Changed: 1  Warnings: 0
    
    				mysql> select * from user;
    				+----+-------+--------+
    				| id | name  | salary |
    				+----+-------+--------+
    				|  1 | zekai |    900 |
    				|  2 | min   |   1100 |
    				+----+-------+--------+
    				2 rows in set (0.00 sec)
    
    				mysql> #2.提交
    				mysql> commit;
    				Query OK, 0 rows affected (0.06 sec)
    

    rollback: 回滚

    mysql> start transaction;
    					Query OK, 0 rows affected (0.00 sec)
    
    					mysql>
    					mysql>
    					mysql> update user set salary=800 where name='zekai';
    					Query OK, 1 row affected (0.01 sec)
    					Rows matched: 1  Changed: 1  Warnings: 0
    
    					mysql> select * from user;
    					+----+-------+--------+
    					| id | name  | salary |
    					+----+-------+--------+
    					|  1 | zekai |    800 |
    					|  2 | min   |   1100 |
    					+----+-------+--------+
    					2 rows in set (0.00 sec)
    
    					mysql> rollback;
    					Query OK, 0 rows affected (0.11 sec)
    
    					mysql> select * from user;
    					+----+-------+--------+
    					| id | name  | salary |
    					+----+-------+--------+
    					|  1 | zekai |    900 |
    					|  2 | min   |   1100 |
    					+----+-------+--------+
    					2 rows in set (0.00 sec)
    				
    				rollback回滚,影响所有:
    					
    					mysql> start transaction;
    					Query OK, 0 rows affected (0.00 sec)
    					
    					mysql> update user set salary=800 where name='zekai';
    					Query OK, 1 row affected (0.00 sec)
    					Rows matched: 1  Changed: 1  Warnings: 0
    
    					mysql> update user set salary=700 where name='zekai';
    					Query OK, 1 row affected (0.00 sec)
    					Rows matched: 1  Changed: 1  Warnings: 0
    
    					mysql> select * from user;
    					+----+-------+--------+
    					| id | name  | salary |
    					+----+-------+--------+
    					|  1 | zekai |    700 |
    					|  2 | min   |   1100 |
    					+----+-------+--------+
    					2 rows in set (0.00 sec)
    
    					mysql> rollback;
    					Query OK, 0 rows affected (0.05 sec)
    
    					mysql> select * from user;
    					+----+-------+--------+
    					| id | name  | salary |
    					+----+-------+--------+
    					|  1 | zekai |    900 |
    					|  2 | min   |   1100 |
    					+----+-------+--------+
    					2 rows in set (0.00 sec)
    

    特性:

    ​ 原子性(Atomicity), 原子意味最小的粒子,即不能再分的事务,要么全部执行,要么全不取消(就像上面的银行的例子)
    ​ 一致性(Consistency), 指事务发生前后,数据的总额依然匹配
    ​ 隔离性(Isolation), 简单点说, 某个事物的操作对其他事务是不可见的
    ​ 持久性(durability), 当事务完成后,其影响应该保留下来,不能撤销,只能通过"补偿性事务"来抵消之前的错误

    存储引擎

    ​ InnoDB : 保时捷引擎

    ​ MyIsam : 奔奔引擎

    建表的时候,

    create table user (
    						id int auto_increment primary key,
    						name varchar(32) not null default '',
    						salary int not null default 0
    					)engine=Innodb charset utf8;
    

    mysql5.5以上, 默认用到就是InnoDB

    两个引擎的区别:
    Innodb支持事务,MyISAM不支持
    InnoDB支持行锁,MyISAM支持的表锁

    视图

    ​ 项目, 有100个SQl, 其中80个SQL都是:select * from user where name='xxx';

    ​ 增加视图:
    ​ create view 视图名 as SQL语句;

    ​ 删除:
    ​ drop view v1;

    ​ 例子:

    mysql> select * from user where name='zekai';
    			+----+-------+--------+
    			| id | name  | salary |
    			+----+-------+--------+
    			|  1 | zekai |    900 |
    			+----+-------+--------+
    			1 row in set (0.00 sec)
    
    
    			mysql> create view v1 as select * from user where name='zekai';
    			Query OK, 0 rows affected (0.07 sec)
    
    			mysql>
    			mysql> show tables;
    			+-----------------+
    			| Tables_in_test3 |
    			+-----------------+
    			| user            |
    			| v1              |
    			+-----------------+
    			2 rows in set (0.00 sec)
    
    			mysql> select * from v1;
    			+----+-------+--------+
    			| id | name  | salary |
    			+----+-------+--------+
    			|  1 | zekai |    900 |
    			+----+-------+--------+
    			1 row in set (0.00 sec)
    

    触发器

    ​ 两张表:
    ​ 订单表 库存表

    ​ 场景:
    ​ 当我下一个订单的时候, 订单表中需要增加一个记录, 同时库存表中需要减1
    ​ 这两个操作是同时发生的, 并且前一个操作出发后一个操作

    ​ 使用放法:

    #  增加:
    delimiter //
    				
    CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON t2 FOR EACH ROW
    BEGIN
    	INSERT INTO t3 (NAME) VALUES ('aa');
    END //
    
    delimiter ;
    			
    			### 当向tb1表中添加一条数据的同时, 向tb2表添加一条数据
    
    #  查看:
     show triggersG
    	*************************** 1. row ***************************
    				 Trigger: tri_before_insert_tb1
    				   Event: INSERT
    				   Table: t2
    			   Statement: BEGIN
    	INSERT INTO t3 (NAME) VALUES ('aa');
    	END
    				  Timing: BEFORE
    				 Created: 2019-11-01 11:47:20.65
    				sql_mode: ONLY_FULL_GROUP_BY
    				 Definer: root@localhost
    	character_set_client: gbk
    	collation_connection: gbk_chinese_ci
    	  Database Collation: latin1_swedish_ci
    
    

    删除: drop trigger 触发器名:

    例子:
    	mysql> select * from t2;
    	Empty set (0.00 sec)
    
    	mysql> select * from t3;
    	Empty set (0.00 sec)
    	mysql> insert into t2 (name) values ('zekai');
    	Query OK, 1 row affected (0.06 sec)
    
    	mysql> select * from t2;
    	+----+-------+
    	| id | name  |
    	+----+-------+
    	|  1 | zekai |
    	+----+-------+
    	1 row in set (0.00 sec)
    
    	mysql> select * from t3;
    	+----+------+
    	| id | name |
    	+----+------+
    	|  1 | aa   |
    	+----+------+
    	1 row in set (0.00 sec)
    

    存储过程

    ​ 像 一个 SQL函数

    ​ 创建

    delimiter //
    		
    			create procedure p1()
    			BEGIN
    				select * from user where id=2;
    			END //
    			
    			delimiter ;
    

    例子:

    mysql> delimiter //
    
    			mysql> create procedure p1()
    				-> BEGIN
    				-> select * from user where id=2;
    				-> END //
    			Query OK, 0 rows affected (0.10 sec)
    
    			mysql> delimiter ;
    
    			mysql> call p1();
    			+----+------+--------+
    			| id | name | salary |
    			+----+------+--------+
    			|  2 | min  |   1100 |
    			+----+------+--------+
    			1 row in set (0.00 sec)
    
    			Query OK, 0 rows affected (0.01 sec)
    

    删除

    drop procedure p1;
    

    函数

    CHAR_LENGTH(str)
    			返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
    			对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
    		
    		CONCAT(str1,str2,...)
    			字符串拼接
    			如有任何一个参数为NULL ,则返回值为 NULL。
    		FORMAT(X,D)
    			将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
    			例如:
    				SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
    		INSTR(str,substr)
    			返回字符串 str 中子字符串的第一个出现位置。
    		LEFT(str,len)
    			返回字符串str 从开始的len位置的子序列字符。
    		LOWER(str)
    			变小写
    		UPPER(str)
    			变大写
    		LTRIM(str)
    			返回字符串 str ,其引导空格字符被删除。
    		RTRIM(str)
    			返回字符串 str ,结尾空格字符被删去。
    		SUBSTRING(str,pos,len)
    			获取字符串子序列
    		LOCATE(substr,str,pos)
    			获取子序列索引位置
    		REPEAT(str,count)
    			返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
    			若 count <= 0,则返回一个空字符串。
    			若str 或 count 为 NULL,则返回 NULL 。
    		REPLACE(str,from_str,to_str)
    			返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
    		REVERSE(str)
    			返回字符串 str ,顺序和字符顺序相反。
    		RIGHT(str,len)
    			从字符串str 开始,返回从后边开始len个字符组成的子序列
    

    运维方向

    ​ 数据库的备份

    ​ 为啥要备份?
    ​ 要将重要的数据保存下来

    ​ 用法:

    #语法:
    				# mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名,  表名,.... > aaa.sql
    
    				#示例:
    				#单库备份
    				mysqldump -uroot -p123 db1 > db1.sql
    				mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
    
    				#多库备份
    				mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
    
    				#备份所有库
    				mysqldump -uroot -p123 --all-databases > all.sql
    		
    			重新导入:
    				mysql> source D:/test3.sql;
    
  • 相关阅读:
    GitLab用户权限管理
    类似vant中的tab实现
    Gitgitee/github/gitlab账号分离
    Vim操作
    partition by 用法
    crontab执行feat_gen.sh时,报错找不到pyspark
    SQL同一个字段出现null和0值,有何区别,原因是什么?left join导致null值出现,case when导致0值出现
    linux 定时任务crontab的用法
    卡方检验
    ROC与AUC
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11788580.html
Copyright © 2020-2023  润新知