事务

  • 事务是指一组操作, 要么都执行成功, 要么都执行失败

  • 实例

    '''
    问题: 我和朋友银行卡上各有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

  • 两个引擎的区别:
    1. InnoDB支持事务, MyIsam不支持事务
    2. 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 triggers\G  # 查看触发器详细结果
    
    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