zoukankan      html  css  js  c++  java
  • 数据库 事务。

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

        思考:
            我去银行给朋友汇款,
            我卡上有1000元,
            朋友卡上1000元,
            我给朋友转账100元(无手续费),
            如果,我的钱刚扣,而朋友的钱又没加时,
            网线断了,怎么办?
        
        演示:
            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;
            
            例子: 
                commit成功:
                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
                
                两个引擎的区别:(**************)
                    1. Innodb支持事务,MyISAM不支持
                    2. InnoDB支持行锁,MyISAM支持的表锁
                    
                
    
        
    2.视图
        
        项目, 有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)
        
        
    
    3.触发器
        
        两张表:
            订单表     库存表
            
        场景:
            当我下一个订单的时候, 订单表中需要增加一个记录, 同时库存表中需要减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)
            
            
    4.存储过程
        
        像  一个 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;
        
        
    
    5.函数
        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个字符组成的子序列
        
        
        http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions
        
        
        
        
    6.运维方向:
        数据库的备份
        
            为啥要备份?
                将重要的数据保存下来
            
            用法:
                #语法:
                # 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;
  • 相关阅读:
    ServiceStack.Redis之IRedisClient<第三篇>【转】
    Redis常用命令速查 <第二篇>【转】
    Redis 安装与简单示例 <第一篇>【转】
    OKHttp使用简介
    android studio快捷键
    android客户端向java服务端post发送json
    安卓开发--HttpDemo02
    安卓开发--HttpDemo01
    安卓开发--HttpClient
    安卓开发--AsyncTask2
  • 原文地址:https://www.cnblogs.com/WQ577098649/p/11789316.html
Copyright © 2011-2022 走看看