事务
-
事务是指一组操作, 要么都执行成功, 要么都执行失败
-
实例
''' 问题: 我和朋友银行卡上各有1000元, 我给朋友转账200元, 如果我的钱刚扣, 而朋友的钱又没加时, 刚好断网, 怎么办? ''' # 创建我的账户信息表 create table my_account ( id int auto_increment primary key, name varchar(32) not null default "", amount int not null default 0 ) charset utf8; insert into my_account (name, amount) values ("蔡启龙", 1000); # 创建朋友的账户信息表 create table my_friend_account ( id int auto_increment primary key, name varchar(32) not null default "", amount int not null default 0 ) charset utf8; insert into my_friend_account (name, amount) values ("璀璨", 1000); # 开两个客户端, 相当于两个进程 update my_account set amount = 800 where name = "蔡启龙"; # ...突然断电, 我的钱扣了, 朋友的钱没加 update my_friend_account set amount = 1200 where name = "璀璨";
-
使用事务解决
start transaction; # 开启事务 update my_account set amount = 600 where name = "蔡启龙"; update my_friend_account set amount = 1400 where name = "璀璨"; commit # 将内存中的结果交付至硬盘
-
事务回滚
start transaction; # 开启事务 update my_account set amount = 500 where name = "蔡启龙"; update my_account set amount = 400 where name = "蔡启龙"; update my_friend_account set amount = 1600 where name = "璀璨"; rollback; # 事务回滚至开启位置 select * from my_account; # 600
-
事务的四大特性:
- 原子性(Atomicity): 原子意为最小的粒子, 既不能再分的事务, 要么全部执行, 要么全部取消
- 一致性(Consistency): 指事务发生前和发生后, 数据的总额依然匹配
- 隔离型(Isolation): 指某个事务的操作对其他的事务不可见
- 持久性(Durability): 指事务完成后, 其影响应该保留下来, 不能撤销, 只能通过"补偿性"事务来抵消之前的错误
存储引擎
- InnoDB: 保时捷引擎
- MyIsam: 奇瑞引擎
mysql 5.5 以上默认建表的时候用的就是InnoDB
- 两个引擎的区别:
- InnoDB支持事务, MyIsam不支持事务
- InnoDB支持行锁, MyIsam只支持表锁
视图
-
使用场景, 有100个sql查询语句, 其中80个都是
select * from test_primary_key where name = "蔡启龙19941210;"
# 创建视图 create view v as select * from test_primary_key where real_name = "蔡启龙941210"; # 查看视图中的数据 select * from v; ''' +--------+--------------+ | id | real_name | +--------+--------------+ | 941210 | 蔡启龙941210 | +--------+--------------+ ''' # 删除视图 drop view v; # 一般视图中的数据不修改
触发器
-
两个操作同时发生, 并且前一个操作触发后一个操作
-
使用场景: 当我们下一个订单的时候, 订单表中如果增加一个记录, 与此同时库存表中相应数据需要减1
# 创建订单表 create table test_tri_order ( id int auto_increment primary key, product varchar(32) not null default "" ) charset utf8; # 创建库存表并插入库存数据 create table test_tri_stock ( id int auto_increment primary key, amount int not null default 0 ) charset utf8; insert into test_tri_stock values (1, 100); # 创建订单库存触发器 delimiter // # 修改执行分割符 create trigger order_stock_tri # 声明触发器名 after insert on test_tri_order for each row # 声明触发时间和触发条件 begin update test_tri_stock set amount = amount - 1 where id = 1; # 定义触发语句 end// delimiter ; # 改回执行分隔符 insert into test_tri_order (product) values ("沐浴露"); # 在订单表中插入数据 show triggersG # 查看触发器详细结果 drop trigger order_stock_tri; # 删除触发器
存储过程
-
相当于定义一个sql函数
# 定义一个存储过程 delimiter // create procedure p() begin select * from boys; end// delimiter ; # 使用一个存储过程 call p(); # 删除一个存储过程 drop procedure p;
函数
select upper("cql");
+--------------+
| upper("cql") |
+--------------+
| CQL |
+--------------+
数据备份(将重要的数据保存下来)---运维方向
mysqldump -h 服务器 -u 用户名 -p 密码 数据库名 [表1名, ...] > 备份路径
# 注意: 备份需退出mysql程序, 执行mysqldump.exe程序, 备份路径注意分隔斜杠的格式
# 单库备份
mysqldump -uroot -pCql123456 test boys girls > G:/软件压缩包/mysql-5.7.28/备份测试/test-boys-girls.sql
# 多库备份
mysqldump -uroot -pCql123456 --databases mysql test > G:/软件压缩包/mysql-5.7.28/备份测试/mysql_test.sql
# 备份所有库
mysqldump -uroot -pCql123456 --all-databases > G:/软件压缩包/mysql-5.7.28/备份测试/all.sql
# 重新导入
source G:/软件压缩包/mysql-5.7.28/备份测试/test.sql