zoukankan      html  css  js  c++  java
  • 数据库5

    事务

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

    • 实例

      '''
      问题: 我和朋友银行卡上各有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 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
    
  • 相关阅读:
    正向代理和反向代理的区别
    response对象和request对象详解
    非controller层获取response和request对象
    Java中的Lock与synchronized
    如何解决jeecgBoot前端运行项目之后无法获取验证码的问题
    怎么定义一个自己的vue组件
    前端集成方案——理论(二)
    javascript基础-ajax
    网页中文乱码
    javascript基础-事件2
  • 原文地址:https://www.cnblogs.com/-406454833/p/11789947.html
Copyright © 2011-2022 走看看